图片 1

UIBarButtonItem我用了这些姿势才能和你交互

1、Map<String,Object> map = 
ActionContext.getContext().getSession();

图片 2

下面是需求完成图(自己做了优化)

2、HttpSession session =
ServletActionContext.getRequest().getSession();

进来获取!!!!进来获取!!!!

  • 字符串和传递进来的一样 则不允许进行提交交互
  • 当编辑框没有任何的编辑文字也不允许交互

3、让Action实现SessionAware接口,并实现public void
setSession(Map<String, Object> session) {}
方法,Struts2会在实例化Action后调用该方法,通过方法参数将Session对象注入进来。如果我们想获取Session,我们可以定义成员变量,接收注入进来的Session对象。

图片 3

图片 4

比如:

图片 5

因为系统是没有方式可以获取到 Done
按钮的,我们运用运行时倒是可以获取到这个按钮。

public class UserAction implements SessionAware{    
      private Map<String,Object> session;

      //.........     

    @Override
    public void setSession(Map<String, Object> session) {
        this.session=session;

    }
}

下面是获取按钮的逻辑。

三种方式的比较:

UIButton *btn;
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            UIButton *btn = (UIButton *)view;
            btn.userInteractionEnabled = isAllowOperation;
            btn.enabled = isAllowOperation;
        }
    }

返回类型的对比:1,3获取的Session类型是Map<String,Object>类型,2获取的类型是HttpSession。

大家可以看出来,我们便利了
self.navigationController.navigationBar所有的子试图,找到
UINavigationButton这个类控件。因为我们这个界面只有一个元素,我们就逻辑就没做复杂的判断了。

获取方式对比:

我们在输入框文字进行改变的时候,动态获取发现是可以的。当我在
ViewDidLoad方法直接调用这个方法竟然这个按钮还没有添加。

1,2是我们主动获取Session,3是采用注入的方式自动注入Session,这是被动的。

当我们对已经存在的数据进行编辑的时候,如果进来没有做判断,可以允许用户进行编辑的时候,这是一个不好的交互体验。

推荐使用3来创建Session,因为它更为灵活而且符合面向接口编程的思想。

我们要做就做的好一些,在 ViewDidLoad页面加载设置
Done按钮不允许用户进行交互。

 

但是刚才的方法已经不能获取到了。如果我们自定义按钮,自然是没有什么难度的,但是考虑到要自己设置按钮的颜色。如果之后全部更改颜色,这个地方就要改动,万一忘记改动就会出现问题。

上面的第三种方式介绍了Action使用实现SessionAware的方式获得封装了session的Map对象,除此之外还有提供如下的接口RequestAware(获得封装了request的Map对象),ApplicationAware(获得封装了application的session对象),ServletRequestAware(获得HttpServletRequest对象),ServletResponseAware(获得HttpServletResponse对象),ServletContextAware(获得ServletContext对象)。

所以觉得还是用系统的,之后禁用系统的交互。这样出问题的几率比较小。

 

我首先想到的利用 KVO最后发现对于数组 字典是无法进行
KVO,只能通过其他的方法。这是系统内部的数组,我们不清楚系统怎么添加的,简单的拦截
NSArray的添加元素方法或者重写或者会出现其他的问题。

原文链接:Struts2中获取session的三种方式

唯一方法就是我们怎么知道界面展示的时候,什么时候子试图里面才有
Done这个按钮。

 

经过测试, viewDidLayoutSubviews方法和
viewDidAppear方法都可以获取到这个按钮。

但是调用是 viewDidLayoutSubviews
viewDidAppear之前。我们为了不出现页面已经出现在用户严重,按钮
Done从可用变成不可用。 我们在 viewDidLayoutSubviews
方法里面来进行判断。

- (void)setNeedDoneButtonOperation {
    NSString *nowEditString = self.editStringView.textFiled.text;
    /*!
     * 当正在编辑的字符串等于赋值过来字符串 或者没有编辑内容
     */
    BOOL isAllowOperation = nowEditString.length > 0 && ![nowEditString isEqualToString:self.editString];
    UIButton *btn;
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            UIButton *btn = (UIButton *)view;
            btn.userInteractionEnabled = isAllowOperation;
            btn.enabled = isAllowOperation;
        }
    }
}

这样我们在页面出现的时候,就已经禁用了 Done按钮。

突然想起来,没有任何一个编辑界面让用户进来就可以提交,都是用户改变了输入框的内容之后才可以进行提交的。

这样我们在进入这个页面直接禁用 Done也是可以的。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注