2016-04-09 35 views
0

我有一个应用程序需要您在应用程序的多个位置选择模式UIViewController中的数据。想象一下,像这样:你想看看餐厅是否有任何可用的餐桌 - >弹出式样UIViewController,你可以在列表中选择一家餐馆,从而消除餐厅并将数据传回展示视图。你想看到相关的餐馆 - >一个模式UIViewController弹出,你在列表中选择一家餐馆,它将它解散并将数据传回给展示视图。等提供UIViewController并将数据传回给显示视图

现在,我可以通过在呈现视图中设置RestaurantViewController.delegate = self。然后,我可以打电话给像[delegate pickedRestaurant:restaurant];,但我不喜欢这是多么的非常规。

是否有任何其他方式提出数据回调UIViewController

+0

你是什么意思委托模式是“非一般”?这正是该模式设计的目的,以确保呈现的视图控制器仅关注其自己的实现;代表可以根据需要回应回调,而不会影响子控制器的责任。 – Stuart

+0

那么,@Stuart我的意思是我需要多次实现相同的代码。但是在做了一些扩展研究之后,我同意这对我来说是最好的选择。 – user4992124

回答

2

A delegate设计模式在您想要将数据传递回呈现的UIViewController时非常有用,正如您在问题中指出的那样。如果你不想去委托设计模式,那么也许你可以使用NSNotificationCenter?它没有太多的内存,它触发了一个应用程序范围的广播,可以通过一个NSObserver获取,您可以将它放在您的演示文稿UIViewController(即假设您的演示UIViewController仍在内存中)。例如,代码可以看起来像沿此线的东西:

ViewControllerA.swift

override func viewDidLoad(){ 
super.viewDidLoad() 
let notifCenter = NSNotificationCenter.defaultCenter() 
notifCenter.addObserver(self, selector: #selector(ViewControllerA.methodToTrigger), name: "pickedRestaurantNoti", object: nil) 
} 

func methodToTrigger(notification:NSNotification){ 

    let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!> 
    let pickedRestaurantFromB = userInfo["pickedRestaurant"] 
    // pickedRestaurantFromB should have the value of "Restaurant 1" 
    // handle that value now that you have gotten it 

} 

ViewControllerB.swift

func someMethod(){ 
let notifCenter = NSNotificationCenter.defaultCenter() 
notifCenter.postNotificationName("pickedRestaurantNoti", 
         object:nil, 
         userInfo:["pickedRestaurant":"Restaurant 1"]) 
} 
-1

假设有两个VC A和B.

在波黑作为

@property A *aobjet 

和财产阿添加属性为

@property NSString *str; 

当B存在这样调用距离Am

B *b = [B alloc]init]; 
[self presentViewController:B animated:YES completion:^{ 
    b.aobject = self; 

}]; 

从B.m流行例如字符串前的再设置属性,

self.aobject.str = @"your data"; 
[[self.navigationController popViewController animated:YES]; 

请避免语法错误,如果有的话,因为我在这里键入它!

相关问题