Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用dismissViewController发回数据_Ios_Iphone_Objective C_Ipad_Popviewcontroller - Fatal编程技术网

Ios 如何使用dismissViewController发回数据

Ios 如何使用dismissViewController发回数据,ios,iphone,objective-c,ipad,popviewcontroller,Ios,Iphone,Objective C,Ipad,Popviewcontroller,我在iPhone应用程序中有两个视图FirstViewController和MultiSelectViewController 在FirstViewController中,有一个按钮可转到MultiSelectViewController。在MultiSelectViewController中,我有一个tableviewcontroller可以使用“完成”按钮进行multiselect并将结果发送回FirstViewController 我的问题是“完成”按钮。我不知道如何将数据发送回First

我在iPhone应用程序中有两个视图
FirstViewController
MultiSelectViewController

FirstViewController
中,有一个按钮可转到
MultiSelectViewController
。在
MultiSelectViewController
中,我有一个
tableviewcontroller
可以使用“完成”按钮进行multiselect并将结果发送回
FirstViewController

我的问题是“完成”按钮。我不知道如何将数据发送回
FirstViewController
。它必须与
dissmissviewcontroller
一起使用

这是
MultiSelectViewController的.h文件

@protocol MultiSelectDelegate <NSObject>
-(void) multiselectViewControllerDismissed;
@end

@interface MultiSelectViewController : UITableViewController
{
  __weak id myDelegate;
}
@property(nonatomic,retain)NSArray *myData;
@property(nonatomic, retain)NSMutableArray *selectedData;
@property (nonatomic, weak) id<MultiSelectDelegate> myDelegate;
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.allowsMultipleSelection = YES;
selectedData=[[NSMutableArray alloc] init];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                              style:UIBarButtonItemStyleBordered
                                                             target:self
                                                             action:@selector(multiselectViewControllerDismissed)];
self.navigationItem.rightBarButtonItem = barButton;

 }
最后是我的按钮动作:

-(void)multiselectViewControllerDismissed
{
   NSLog(@"%@",selectedData);

}
我不明白如何发送数据并返回到您重新定义的
FirstViewController

@protocol MultiSelectDelegate <NSObject>
-(void) multiselectViewControllerDismissed;
@end

@interface MultiSelectViewController : UITableViewController
{
  __weak id myDelegate;
}
@property(nonatomic,retain)NSArray *myData;
@property(nonatomic, retain)NSMutableArray *selectedData;
@property (nonatomic, weak) id<MultiSelectDelegate> myDelegate;
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.allowsMultipleSelection = YES;
selectedData=[[NSMutableArray alloc] init];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                              style:UIBarButtonItemStyleBordered
                                                             target:self
                                                             action:@selector(multiselectViewControllerDismissed)];
self.navigationItem.rightBarButtonItem = barButton;

 }
multiselectViewControllerDismissed
将方法委派为

 multiselectViewControllerDismissedWithData:(NSMutableArray *)dataSelected
并且,在
FirstViewController
的.h文件中实现委托,即

@interface FirstViewController: UIViewController <MultiSelectDelegate> 
 [self.myDelegate multiselectViewControllerDismissedWithData:selectedData];  
实施

 -(void)multiselectViewControllerDismissedWithData:(NSMutableArray *)dataSelected  
此方法在
FirstViewController.m

并且,在
MultipleSelectViewController.m
的“完成”按钮操作方法中,调用方法
multiselectviewcontrollerdissistedwithdata
,即

@interface FirstViewController: UIViewController <MultiSelectDelegate> 
 [self.myDelegate multiselectViewControllerDismissedWithData:selectedData];  
就这样。
您现在可以将
selectedData
数组从
MultipleSelectViewController
传递到
FirstViewController
在obj-c中传递数据的两种标准方式:

@protocol MultiSelectDelegate <NSObject>
-(void) multiselectViewControllerDismissed;
@end

@interface MultiSelectViewController : UITableViewController
{
  __weak id myDelegate;
}
@property(nonatomic,retain)NSArray *myData;
@property(nonatomic, retain)NSMutableArray *selectedData;
@property (nonatomic, weak) id<MultiSelectDelegate> myDelegate;
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.allowsMultipleSelection = YES;
selectedData=[[NSMutableArray alloc] init];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                              style:UIBarButtonItemStyleBordered
                                                             target:self
                                                             action:@selector(multiselectViewControllerDismissed)];
self.navigationItem.rightBarButtonItem = barButton;

 }
  • 使用引用并手动分配。在您的示例中,第一个视图控制器将自身的引用传递给第二个视图控制器。第二个视图控制器使用引用为指定的属性指定所需的数据
  • 使用
    LocalNotifications
    的发布服务器订阅服务器模式。第一视图控制器侦听特定的位置通知,第二视图控制器在被解除之前使用数据进行广播
  • 我推荐第一种方法作为你的例子。一些示例代码:

    在.h文件中:

    @interface FirstViewController:UIViewController
    
    @property NSMutableArray *receivedData; //property to receive selected data
    
    @end
    
    在.m文件中:

    MultiSelectViewController *msvc = [MultiSelectViewController alloc] init];
    msvc.presentingViewController = self; // pass reference of 1st VC to 2nd VC
    [self presentViewController:msvc animated:YES];
    
    在MultiSelectViewController.h文件中:

    #import "FirstViewController.h"
    
    @interface MultiSelectViewController: UITableViewController
    ...
    
    @property FirstViewController *presentingViewController;
    ...
    @end
    
    在MultiSelectViewController.m文件中:

    -(void)multiselectViewControllerDismissed
    {
       NSLog(@"%@",selectedData);
       presentingViewController.receivedData = selectedData;
    }
    

    首先将委托方法创建为

    -(void)dismiss:(NSString *)str;
    
    而select是否根据indexpath.row从中获取值 并将其存储为nsstring

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
    
       self.valueString=[NSString stringWithFormat:@"%@",[self.arrayValue objectAtIndex:indexPath.row]];
        NSLog(@"%d",indexPath.row);
    
       }
    
    完成按钮单击:

    像这样调用委托方法

    [self. myDelegate dismiss:"your string which you get from table"]
     [[self navigationController] popViewControllerAnimated:YES];
    
    在您的第一个视图控制器中

    导入视图控制器类并调用委托方法

    为第二个视图控制器创建实例

     MultiSelectViewController *txtNext=[[MultiSelectViewController alloc]init];
      txtNext. myDelegate =self;
    
    然后


    您需要传递什么值?尝试此操作可能会有所帮助[dismissModalViewController AND pass data back][1][1]:谢谢和干杯。selectedData,这是我在tableview中填充的数组代理如果选择了cell,请完成此处描述的步骤谢谢回答。我更改了“完成”按钮的操作-(void)done{if([self.myDelegate respondsToSelector:@selector(multiselectviewcontrollerdissed:)){[self.myDelegate multiselectviewcontrollerdissed:selectedData];}[self dismissionviewcontrolleranimated:YES completion:nil];//NSLog(@“%@”,selectedData);}但是,我可以将数据发送回FirstViewController,我无法关闭页面。我的意思是它留在MultiSelectViewController中