我是一名学习iOS的Android程序员。我有一个快速的view1调用一个客观的C view2。我期待从view2返回一个String回到视图1。
在Android中,我们只需查看.startActivityForResult(View2.class)
iOS的方法是什么?
答案 0 :(得分:5)
ViewController2.h - Objective-C
@protocol ViewController2Delegate <NSObject>
- (void)sendStringBack:(NSString *)aString;
@end
@interface ViewController2 : UIViewController
@property (nonatomic, weak) id<ViewController2Delegate> delegate;
@end
ViewController2.m - Objective-C
// When you want to send the string back and dismiss the view:
[self.delegate sendStringBack:theStringToSendBack];
ViewController1.swift - Swift
@objc class ViewController1: UIViewController, ViewController2Delegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let viewContr = segue.destinationViewController as! ViewController2
viewContr.delegate = self
}
func sendStringBack(aString: String) {
let aVariable = aString
// do something with the string
// dismiss the view if you presented it modally
self.dismissViewController(self, animated: true, completion: nil)
// OR
// dismiss the view if you presented it with show/push
self.navigationController?.popViewControllerAnimated(true)
}
}
答案 1 :(得分:1)
iOS中没有类似startActvityForResult()的东西。你必须手动完成。我是通过以下过程完成的。 ViewControllerOne有一个需要来自viewControllerTwo的数据的表单。 ViewControllerTwo有一个带有dataList的tableView。通过点击ViewController的tableView上的数据,它将返回ViewControllerOne,其中包含被点击的表数据。
在ViewControllerTwo中有一个tablewView。在didSelectRowAt方法中,将数据设置为全局变量并调用该方法 self.navigationController?.popViewController(animated:true)如下所示。
func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){ data = dataList [indexPath.row] self.navigationController?.popViewController(animated:true) }
它将返回ViewControllerOne。现在,您已在viewWillAppear()或viewDidAppear()方法中捕获数据。例如:
覆盖func viewWillAppear(_ animated:Bool){ if data!=&#34;&#34; { //用这些数据做你想做的事。完成工作后,将数据值设置为空。 data =&#34;&#34; } }
多数民众赞成。快乐的编码。它将100%确定
答案 2 :(得分:-1)
为此目的使用UIViewController+CallBack。
只需要从父控制器设置结果对象,子控制器将覆盖协议方法并将任何类型的对象返回给父控件。
- (ID)viewUnloadWithResultObject
无需设置协议
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"NewViewController"];
[controller setResultBlock:^(id resultObject) {
NSLog(@"New View Controller did pop and resulting object is: %@", resultObject);
}];
[self.navigationController pushViewController:controller animated:YES];
您还可以呈现视图控制器并获取相同的结果对象
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"NewViewController"];
[controller setResultBlock:^(id resultObject) {
NSLog(@"New View Controller did dismissed and resulting object is: %@", resultObject);
}];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentViewController:navController animated:YES completion:NULL];
此外,您还可以查看卸载回调方法。即。
- (无效)viewWillUnloadCallBack
- (无效)viewDidUnloadCallBack
只需继承协议并在视图控制器中覆盖这些方法即可获得卸载回调。