iOS:如何让一个视图在另一个视图中触发更新?

时间:2015-01-31 17:42:53

标签: ios swift uiview

我的顶级UIView包含一些标签和绘图画布。绘图画布本身是UIView,它会覆盖其drawRect() 方法,当然还有各种触摸方法。当用户完成绘图时,我想更新画布外的一个或多个标签(即顶级UIView的所有组件)。

最好的方法是什么?
我目前有顶级UIViewController从顶级CanvasView将各种标签传递到我的viewDidLoad() s中} 方法我将它们存储在本地。每当我需要更新标签时,我都会从我对这些兄弟视图的本地副本中这样做 - 但我对此并不满意,因为它感觉很笨拙。

为了进一步解释,这是我在顶级UIViewController中所做的:

@IBOutlet weak var myLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    for v in self.view.subviews {
        if v .isKindOfClass(CanvasView) {
            let canvasView = v as CanvasView
            canvasView.setMyLabel(myLabel)
        }
    }
}

然后在我的CanvasView.swift文件中,我有:

private var myLabel: UILabel!

...

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    // do stuff ...
    setNeedsDisplay()
    myLabel.text = "etc.etc."
}

有更好的方法吗?


感谢。大道

2 个答案:

答案 0 :(得分:0)

我会实施delegate pattern。创建画布时,传递父视图控制器,您可以在其中实现各种回调方法。

Here您可以找到有关实施委托的各种方法的更详细说明。对于这个单一且简单的用例,其中一些可能有点过分。

示例:您有一个游戏内容(称为游戏),它定义了一个委托协议。该协议包含几种不同事件的方法。 (例如-(void)gameDidFinish等。)

现在游戏实现了一个方法addDelegate,每个实例都会调用该方法,该方法希望收到某些游戏事件的通知。所有这些将自己注册为代理的实例都实现了游戏协议中定义的全部或部分方法

如果其中一个游戏事件被触发,游戏会检查所有已注册的代表是否已实施相应的方法并进行调用。

重要提示:如上所述,协议可能过度,因为您只有一名代表。

答案 1 :(得分:0)

如果画布是单独的viewController,则可以使用委托协议从画布视图控制器访问基本视图控制器。 假设您有BaseViewController来调用canvasViewController

canvasViewController.h添加以下内容:

@protocol CanvasDelegate <NSObject>
@required
//examples . add your methods to upgate labels here
    - (void) updateLabels: (NSString*) labelText1 and:(NSString*)labelText2;
@end

@interface canvasViewController : UIViewController
{
    id<CanvasDelegate> delegate;
}

@property (retain) id delegate;

@end

现在,只要您想更新标签(或要求baseViewController执行某些操作),就可以从canvasViewController.m文件执行此代码:

[[self delegate] updateLabels:string1 and:string2];

现在,您的基本视图控制器接受来自画布的消息,BaseVC必须采用&#34;采用&#34; CanvasDelegate协议,并实现所需的方法。  在baseViewController.h中,添加以下内容:

@interface baseViewController : UIViewController <CanvasDelegate>

baseViewController.m中为推送创建canvasViewController对象时,添加以下命令:

canvasVC.delegate = self;

并且不要忘记在baseViewController.m中实现所需的方法,如下所示:

- (void) updateLabels: (NSString*) labelText1 and:(NSString*)labelText2
{
    //update your labels here
}