【问题标题】:Pass data from detailview to masterview with delegate not working将数据从详细视图传递到主视图,委托不起作用
【发布时间】:2013-09-27 18:05:40
【问题描述】:

我有一个使用默认模板主详细信息制作的应用程序。我想将一个字符串从详细视图传递到主视图,点击一个按钮。我使用了这段代码:

Detailviewcontroller.h

@protocol DetailViewControllerDelegate <NSObject>
- (void)passItemToMaster:(id)controller didFinishEnteringItem:(NSString *)item;
@end

@interface DetailViewController : UIViewController<UITextFieldDelegate>
{
     NSString *itemToPassBack;
}

@property (copy) NSString *itemToPassBack;
@property (retain) id delegate;

@end

Detailviewcontroller.m

-(IBAction)passBack:(id)sender
{
     itemToPassBack = [[NSString alloc] initWithFormat:@"PassedBack"];


     [[self delegate] addItemViewController:self didFinishEnteringItem: itemToPassBack];
     [self.navigationController popViewControllerAnimated:YES];
 }

Masterviewcontroller.h

 @interface MasterViewController : UITableViewController <DetailViewControllerDelegate>

 @property (nonatomic) NSString *returnedItem;
 @end

Masterviewcontroller.m

 -(void) passItemToMaster:(id) controller didFinishEnteringItem: (NSString *)item
 {
      returnedItem = item;
      NSLog(@"This was returned from secondPageViewController");

 }

如何在主视图中获取对象? nslog 不显示任何内容。

【问题讨论】:

  • [self delegate] 不是 nill 吗?

标签: iphone ios delegates master-detail


【解决方案1】:

当您从 masterViewController 创建 DetailView 时,添加以下行:

_detailViewController.delegate = self;

像这样替换你的prepereForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSString *object = _nameField.text;

         DetailViewController *detailViewController = segue.destinationViewController
        detailViewController.delegate = self;

        [[segue destinationViewController] setDetailItem:object];
    }
}

【讨论】:

    【解决方案2】:

    您可以像这样获得委托对象/属性:

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    
    appDelegate.object;
    [appDelegate property];
    

    【讨论】:

      【解决方案3】:

      感谢您的回答。假设我是 Xcode 编程的新手,我必须了解更好的委托。我使用了模板,我只修改了一些东西。所以我有了这个 ma​​sterviewcontroller.m

      @interface MasterViewController () {
      NSMutableArray *_objects;
      }
      @end
      
      @implementation MasterViewController
      @synthesize returnedItem;
      
      -(void) addItemViewController:(id) controller didFinishEnteringItem: (NSString *)item
      {
      returnedItem = item;
      NSLog(@"This was returned from secondPageViewController");
      
      }
      - (void)viewDidLoad
      {
      [super viewDidLoad];
      // Do any additional setup after loading the view, typically from a nib.
      self.navigationItem.leftBarButtonItem = self.editButtonItem;
      
      UIBarButtonItem *addButton = [[UIBarButtonItem alloc]      initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self    action:@selector(insertNewObject:)];
      self.navigationItem.rightBarButtonItem = addButton;
      }
      
      //create new cell
      - (void)insertNewObject:(id)sender
      {
      if (!_objects) {
          _objects = [[NSMutableArray alloc] init];
      }
      [_objects insertObject:[NSDate date] atIndex:0];
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
      [self.tableView insertRowsAtIndexPaths:@[indexPath]    
      withRowAnimation:UITableViewRowAnimationAutomatic];
      }
      
      #pragma mark - Table View
      
      - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      {
        return 1;
      }
      
      - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
      {
      return _objects.count;
      }
      
      -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath
      {
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"        forIndexPath:indexPath];
      CGRect frame = CGRectMake (68, 12, 225, 22);
      
      UITextField *textfield = [[UITextField alloc] initWithFrame:frame];
      
      [self setNameField:textfield];
      
      [_nameField setDelegate:self];
      [_nameField setReturnKeyType:UIReturnKeyDone];
      [_nameField addTarget:self
                     action:@selector(textFieldFinished:)
           forControlEvents:UIControlEventEditingDidEndOnExit];
      [cell.contentView addSubview: _nameField];
      cell.textLabel.enabled = YES;
      cell.accessoryType = UITableViewCellAccessoryNone;
      return cell;
      
      }
      - (void)textFieldFinished:(id)sender{
      
      [sender resignFirstResponder];
      
      } 
      - (void)tableView:(UITableView *)tableView commitEditingStyle:    (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
      {
      if (editingStyle == UITableViewCellEditingStyleDelete) {
          [_objects removeObjectAtIndex:indexPath.row];
          [tableView deleteRowsAtIndexPaths:@[indexPath]   withRowAnimation:UITableViewRowAnimationFade];
      } else if (editingStyle == UITableViewCellEditingStyleInsert) {
          // Create a new instance of the appropriate class, insert it into the array, and add   a new row to the table view.
      }
      }
      - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
      {
      NSString *title = [_objects objectAtIndex: [fromIndexPath row]];
      [_objects removeObjectAtIndex:[fromIndexPath row]];
      [_objects insertObject:title atIndex:[toIndexPath row]];
      [[self tableView] reloadData];
      
      }
      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      {
      if ([[segue identifier] isEqualToString:@"showDetail"]) {
          NSString *object = _nameField.text;
      
          [[segue destinationViewController] setDetailItem:object];
      }
      }
      @end
      

      我不知道在哪里定义委托。

      【讨论】:

      • 你没有实现- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      • 不,我没有。我应该吗?
      • 你是什么时候创建的“DetailViewController”?
      • 我没有创建它。我该如何创建它?
      猜你喜欢
      • 2014-01-07
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多