【问题标题】:Objective C View to Controller CommunicationObjective C 视图到控制器的通信
【发布时间】:2012-06-13 21:53:09
【问题描述】:

在视图中接受用户输入然后将其传输到该视图的控制器的正确方法是什么?我知道 NotificationCenter 是一种选择,但肯定有更优雅的方式将数据从视图传输到其控制器?

非常感谢所有帮助,我总是接受答案!

【问题讨论】:

    标签: objective-c model-view-controller


    【解决方案1】:

    使用委托协议设计模式,或通过子类化UIControl 来实现目标操作。想想UIButton 如何告诉视图控制器它已被按下。在界面生成器中,您将一个操作(类似于touchUpInside: 的选择器)连接到一个目标(拥有它的视图控制器)。在非 IB 中,您直接告诉 UIButton 使用什么选择器和目标。

    这两种方法在不同的情况下都有意义。例如,对于UITextField,使用委托更有意义,因为文本字段可以向您发送任意数量的事件,例如用户开始编辑、结束编辑或键入字符时的事件。

    对于按钮,使用 target-action 更有意义,因为实际上只有一个事件以不同的形式表示。

    对于滑动和拖动以及其他手势,请使用UIGestureRecognizers。

    【讨论】:

    • 问题是,我想以触摸和拖动的形式接受用户输入,而不是按钮。我该怎么做?
    • 我只是以UIButton 为例。您可能希望将UIGestureRecognizers 添加到您的视图中。
    【解决方案2】:

    您正在寻找DelegationData Source。您可以在此处查看更多信息,Delegation and Data Sources

    一个简短的例子是,类似这样的事情:

      //MyViewSubclass.h
    
      @protocol MyViewSubclassDelegate
      //Implement your delegate methods here.
      -(void)didTouchView; 
      @end
    
      @interface MyViewSubclass {
    
         id<MyViewSubclassDelegate>delegate;
      }
      @property(nonatomic,assign)id<MyViewSubclassDelegate>delegate;
    

    当然,@synthesize 你的delegateMyViewSubclass.m

    现在在类的标题中,您希望 MyViewSubclass 的委托是,您需要遵守 `MyViewSubclassDelegate 协议。

     #import "MyViewSubclass.h"
     @interface MyViewController : UIViewController <MyViewSubclassDelegate>
    

    MyViewController.@implementation 中,实现-(void)didTouchViewMyViewSubclassDelegate 方法。

    当您初始化和创建 MyViewSubclass 对象时,您将 MyViewController 设置为委托:

    myViewSubclass.delegate = self // Self being MyViewController.
    

    在您的MyViewSubclass 中,当您准备好转发任何信息,或者只是想触发您会执行的方法[self.delegate didTouchView]

    希望这会有所帮助!

    【讨论】:

    • 是的,这似乎正是我想要的。使用@protocol 而不是仅仅引用 self.delegate 有什么好处?
    • 太棒了!很高兴我能提供帮助,如果这足以解决您的问题,请检查一下:)
    • 使用@protocol 而不是仅引用委托的好处可以让您更好地控制委托行为。即:在协议中添加@required 会告诉您的委托该方法是必需的,并警告您该方法不存在。除其他事项外,例如,-conformsToProtocol: 检查类 IS 是否确实是您的对象的 delegate
    • @skram,这真的是这样做的方法吗?也许我误解了操作的问题,但按钮、文本字段等的任何操作方法不应该在控制器类中吗?您无需执行任何操作即可将其传输到视图控制器,它应该已经存在。
    • @rdelmar 我相信你误解了他的问题。他不想使用buttons,他想检测视图的触摸。如果他想使用按钮,他当然可以使用UIButton-addTarget:action:forControlEvents: 方法。但是,我认为情况并非如此。
    【解决方案3】:

    您正在寻找delegation,其中控制器将自己设置为视图的委托。你从 UITableViewDelegate 就知道了。

    【讨论】:

      【解决方案4】:

      使您的视图成为UIControl 的子类并实现目标/动作设计模式 - 使用sendActionsForControlEvents: 方法向控制器发送消息。

      【讨论】:

        【解决方案5】:

        通常,像UITextField 这样的 UIKit 对象具有委托方法,您可以实现这些方法来执行您的业务逻辑。例如 UITextField 有一个名为 - textFieldDidEndEditing: 的委托方法,该方法在用户关闭键盘后被调用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-26
          相关资源
          最近更新 更多