没有协议的回传数据

时间:2014-10-27 17:59:45

标签: ios objective-c viewcontroller

我需要将一些数据传递给以前的视图控制器,我的代码有什么问题?在这段代码中“contactViewController”是我的第一个视图控制器,“groupViewController”是我的第二个视图控制器

ContactEditVC.h(firstViewController)

#import "GroupEditTVC.h"

@interface ContactEditVC : UIViewController <SecondViewControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
    UIImageView * imageView;
    UIButton * choosePhotoBtn;
    UIButton * takePhotoBtn;
    UIButton * btnGroup;
}

@property (nonatomic, strong) NSString *groupName;

ContactEditVC.m(firstViewController)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"selectGroup"]){
        //get selected contact


        //pass selected contact to MyContactAppViewController for editing
        GroupEditTVC *destViewcontroller=segue.destinationViewController;
        destViewcontroller.delegate=self;

    }
}


-(void)viewWillAppear:(BOOL)animated
{
    self.txtFname.text=groupName;

}

- (void)dataFromController:(NSString *)data
{
   groupName=data;
}

在我的第二个视觉控制器中:

@protocol SecondViewControllerDelegate <NSObject>
- (void)dataFromController:(NSString *)data;
@end

@interface GroupEditTVC : UITableViewController <UIAlertViewDelegate>

@property (retain) id <SecondViewControllerDelegate> delegate;

@end

GroupEditTVC.m(secendViewController)

#import "ContactEditVC.h"

@interface GroupEditTVC ()
@end

@synthesize delegate;



- (IBAction)donePressed:(id)sender {  
    [[self delegate]dataFromController:@"blabla"];
    [self dismissViewControllerAnimated:YES completion:nil];    
}

还有其他方法可以传回数据吗?

1 个答案:

答案 0 :(得分:0)

您应该尝试关注模型视图控制器。在我的应用程序中,我通常传递对Model类的引用,该类包含我想要共享和更改的大量数据。如果将模型引用传递给GroupEditTVC并更改该屏幕中的数据,则更改的数据可供“root”视图控制器使用,该控制器也具有对相同数据的引用。唯一需要的是“root”视图用新数据刷新它的视图。

因此您不需要传回任何内容,只需更新编辑视图和主视图都具有引用的Model类。

实施例

这个想法是绕过传递字符串和其他“松散耦合”的数据,然后只对一个包含所有相关数据的可靠数据对象进行操作。当您开始使用AFNetworking / Mantle / etcetera时,这也更容易。您只需保存整个数据类,您就不必担心每一小块数据。

因此,对松散字符串的所有引用都应该替换为此对象内的字符串。

-(void)viewWillAppear:(BOOL)animated {
    self.txtFname.text = self.contact.name;
}

数据类

// class that holds the data
@interface Contact : NSObject // Nothing special, just an object

@property NSInteger contactId;
@property NSString *name;
// You can add basically any data here

@end

Segue公司

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([[segue identifier] isEqualToString:@"selectGroup"]){
        //pass selected contact to MyContactAppViewController for editing
        GroupEditTVC *destViewcontroller=segue.destinationViewController;
        destViewcontroller.contact = self.contact; // Adds reference to the same class
    }
}

完成编辑

- (IBAction)donePressed:(id)sender {  
    self.contact.name = self.name.text; // get new name from text box
    [self dismissViewControllerAnimated:YES completion:nil];    
}