iOS的等同于Android的startActivityForResult / setResult是什么?

时间:2015-04-11 17:38:09

标签: ios objective-c swift

我是一名学习iOS的Android程序员。我有一个快速的view1调用一个客观的C view2。我期待从view2返回一个String回到视图1。

在Android中,我们只需查看.startActivityForResult(View2.class)

iOS的方法是什么?

3 个答案:

答案 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,其中包含被点击的表数据。

  1. 创建用于存储数据的全局变量。     var data:String =&#34;&#34;
  2. 使用segue。从
  3. 在ViewControllerTwo中有一个tablewView。在didSelectRowAt方法中,将数据设置为全局变量并调用该方法 self.navigationController?.popViewController(animated:true)如下所示。

    func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){     data = dataList [indexPath.row]     self.navigationController?.popViewController(animated:true) }

  4. 它将返回ViewControllerOne。现在,您已在viewWillAppear()或viewDidAppear()方法中捕获数据。例如:

    覆盖func viewWillAppear(_ animated:Bool){     if data!=&#34;&#34; {         //用这些数据做你想做的事。完成工作后,将数据值设置为空。         data =&#34;&#34;     } }

  5. 多数民众赞成。快乐的编码。它将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
  •   

只需继承协议并在视图控制器中覆盖这些方法即可获得卸载回调。