【问题标题】:How to insert cell into UITableViewController如何将单元格插入 UITableViewController
【发布时间】:2013-08-24 02:59:08
【问题描述】:

我正在创建一个 iPad 应用程序。根 UITableview 在导航控制器中有一个右栏按钮项。当您点击按钮时,它会显示一个弹出控制器。弹出框是一个 UITableViewController。当您在弹出窗口中点击一个单元格时,我如何传递该单元格中的数据并将其插入到根 UITableview 的单元格中?我搜索了 Apple 文档,但找不到我需要的东西。谁能把我推向正确的方向?

根表.h

@interface Roottable : UITableViewController<PopoverDelegate>

Popover.h

    @protocol AthleteSelectPopoverDelegate <NSObject>
    @required
    -(void)selectedObject:(Object *)newObject;
    @end


@property (nonatomic, weak) id<PopoverDelegate> delegate;


    @property (readwrite, nonatomic) Object *currentObject;

@end

popover.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    _currentObject = [_objectArray objectAtIndex:indexPath.row];



    //Notify the delegate if it exists.
    if (_delegate != nil) {
        [_delegate selectedObject:_currentObject];
    }
}

【问题讨论】:

  • 您当前的代码会得到什么结果?此语句是否运行 - [_delegate selectedObject:_currentObject];?你登录了吗?根表视图控制器是如何将自己设置为 Popover 的委托的?

标签: ios objective-c ipad cocoa-touch uitableview


【解决方案1】:

您将所选单元格中的数据添加到主表的数据源委托。

然后该数据源应该告诉主表一个单元格已插入到索引路径中。

【讨论】:

    【解决方案2】:

    我想通了。希望我能帮助别人。我会先解释代码,然后将其发布在下面。基本上,我将根表视图的数据源“ObjectSelect”设置为名为“currentObjectArray”的NSMutableArray。 ObjectSelect 也是 ObjectSelectPopoverDelegate。基本上,当点击弹出窗口中的单元格时,它会将点击的对象添加到“currentObjectArray”并重新加载表格视图。

    ObjectSelect.h

    #import <UIKit/UIKit.h>
    #import "ObjectSelectPopover.h"
    
    @interface ObjectSelect : UITableViewController<ObjectSelectPopoverDelegate>
    
    @property (nonatomic, strong) ObjectSelectPopover *objectPicker;
    @property (nonatomic, strong) UIPopoverController *objectPickerPopover;
    
    @property (readwrite, nonatomic) Object *currentObject;
    
    @property (nonatomic, strong) NSMutableArray *selectedObjectArray;
    
    @end
    

    ObjectSelect.m

    -(void)selectedObject:(Object *)newObject
        {
        _currentObject = newObject;
    
        if(!_selectedObjectArray){
        _selectedObjectArray = [[NSMutableArray alloc] init];
        }
    
        if([_selectedObjectArray containsObject:_currentAthlete]){
            //lol you don't get added, bub
        }
        else{
        [_selectedObjectArray addObject:_currentObject];
        }
        [self.tableView reloadData];
    }
    
    
        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            static NSString *CellIdentifier = @"Cell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
            Object *objectTapped = (Object *)[_objectAthleteArray objectAtIndex:indexPath.row];
    
            return cell;
        }
    

    ObjectSelectPopover.h

    #import <UIKit/UIKit.h>
    #import "Object.h"
    
    @protocol ObjectSelectPopoverDelegate <NSObject>
    @required
    -(void)selectedObject:(Object *)newObject;
    @end
    
    @interface ObjectSelectPopover : UITableViewController
    
    @property (nonatomic, weak) id<ObjectSelectPopoverDelegate> delegate;
    
    @property (nonatomic, strong) NSMutableArray *objectArray;
    
    @property (readwrite, nonatomic) Object *currentObject;
    
    @end
    

    ObjectSelectPopover.m

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        _currentObject = [_objectArray objectAtIndex:indexPath.row];
    
        //Notify the delegate if it exists.
        if (_delegate != nil) {
            [_delegate selectedObject:_currentObject];
        }
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    

    【讨论】:

      【解决方案3】:

      我认为您的弹出框控制器中应该有一个名称不是delegate 的属性,因为UITableViewController 已经具有UITableViewDelegate 协议的delegate 属性;可能是masterTable 什么的。

      然后在根 UITableView 的 selectedObject: 实现中,您可以插入行或将其添加到数据数组和 reload 表中。

      糟糕,我的错...@geraldWilliam 是对的,UITableViewController 没有委托属性...

      您所拥有的似乎应该可以工作... selectedObject: 方法是否在委托中被调用?如果是这样,你用这种方法做什么?如果将对象添加到根视图的数据集(数组或字典或数据库)中,在其 tableview 中插入一行(或重新加载数据),它应该可以工作。

      这是一些适合我的代码。它不是来自弹出框,而是来自推送视图,但没有理由会有所作为:

      - (ThingStatus) thingPicker: (ThingPickerTableViewController *) thingPicker didSelectThing: (Thing *) thing {
          NSLog( @"Entering %s", __func__ );
          // Dismiss the pushed view controller (for you, the popover)
          [self.navigationController popViewControllerAnimated: YES];
      
          NSArray *startingList = self.currentCellObjectList;
          [self.databaseManager addThing: thing];
          NSArray *endingList = self.databaseManager.thingsForTableView;
      
          // Figure out the differences adding made...
          DiffResult *changes = [startingList simpleDiffWithArray: endingList];
          NSLog( @"%d deletions, %d insertions", changes.deletionCount, changes.insertionCount );
          // I only handle insertions in this code... deletions would be similar
          __block NSUInteger objIdx = 0;
          NSMutableArray *changeableThingList = [startingList mutableCopy];
          [changes.insertionIndexes enumerateIndexesUsingBlock: ^( NSUInteger idx, BOOL *stop ) {
              NSLog( @" - insert %@ at %d", [[changes.insertionObjects objectAtIndex: objIdx] name], idx );
              NSIndexPath *indexPath = [NSIndexPath indexPathForRow: idx inSection: 0];
              [changeableThingList insertObject: [changes.insertionObjects objectAtIndex: objIdx] atIndex: idx];
              self.currentCellObjectList = changeableThingList;
              [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationRight];
              ++objIdx;
          }];
          [self.databaseManager save];
          return [self.databaseManager: thingStatus];
      

      }

      【讨论】:

      • UITableView 有一个委托属性。 UITableViewController 没有。
      【解决方案4】:

      这里有一些很好的代码可以帮助你。

       - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
       {
           // Return the number of rows in the section.
          return self.item.count;
       }
      
       -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath
      {
          static NSString *CellIdentifier = @"Cell";
          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
          if (cell == nil) {
              cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
          }
      
          //Get the row
          Sport *rowSport = self.sports[indexPath.row];
      
          cell.textLabel.text = rowItem.itemName;
          cell.detailTextLabel.text = rowItem.section;
      
          return cell;
      }
      

      希望对你有帮助。

      【讨论】:

      • 我知道如何填充单元格,我只是不知道如何在点击弹出单元格时填充单元格。
      • 单元格中的数据来自哪里?
      • 从委托方法来看,它是一个单一的对象,就是在popover中被点击的对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2020-02-04
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多