在选项卡式应用程序中编辑tableview

时间:2012-04-28 20:03:00

标签: uitableview uinavigationcontroller uinavigationbar

我有一个选项卡式视图应用程序,它使用选项卡控制器作为根视图控制器。我的观点之一是一个tableview,我希望能够通过单击添加/编辑按钮进行编辑,该按钮将使所有单元格可编辑以及允许添加单元格。

在表格视图中,我添加了一个导航栏,并尝试使用以下代码在栏上创建一个按钮,按下该按钮将使所有单元格都可编辑:

- (void)viewDidLoad {
[super viewDidLoad];

UIBarButtonItem *editButton = [[UIBarButtonItem alloc]
                               initWithTitle:@"Delete"
                               style:UIBarButtonItemStyleBordered
                               target:self
                               action:@selector(toggleEdit:)];
self.navigationItem.rightBarButtonItem = editButton;          

}


-(IBAction)toggleEdit:(id)sender {

    [self.mTableView setEditing:!self.mTableView.editing animated:YES];

    if (self.mTableView.editing) 
        [self.navigationItem.rightBarButtonItem setTitle:@"Done"];
    else
        [self.navigationItem.rightBarButtonItem setTitle:@"Delete"];

}

代码不起作用,它不会在导航栏上生成按钮。我已经读过我应该使用导航控制器,但是如果我希望这个页面(在我的选项卡视图应用程序中)使用导航控制器,如何让标签栏指向导航控制器作为选择选项?

---- -----更新 好的,我已经制作了一个包含根视图控制器(标签栏控制器)的nib文件。标签栏控制器包含2个视图控制器和一个带有视图控制器的导航控制器。我将导航控制器中的视图控制器链接到包含tableview的视图。当我运行程序并尝试单击tableview的选项卡时,我收到以下错误:

2012-04-29 17:23:28.116 ash [6778:f803] - [UIViewController tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例0x68bb8d0 2012-04-29 17:23:28.117 ash [6778:f803] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [UIViewController tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例0x68bb8d0'

包含tableview的视图控制器是一个实现

的UIViewController

在其m文件中,它包含以下方法:

    #pragma mark -
    #pragma mark Table View Data Source Methods

    - (NSInteger)tableView:(UITableView *)tableView
     numberOfRowsInSection:(NSInteger)section {
        return [self.portfolioArray count];
     }

    - (UITableViewCell *)tableView:(UITableView *)tableView
            cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       static NSString *SimpleTableIdentifier = @"CellTableIdentifier";
      static BOOL nibsregistered = NO;
      if (!nibsregistered) {
      UINib *nib = [UINib nibWithNibName:@"ASHInstrumentCell" bundle:nil];
      [tableView registerNib:nib forCellReuseIdentifier:SimpleTableIdentifier];
      nibsregistered = YES;
     }

     ASHInstrumentCell *cell = [tableView dequeueReusableCellWithIdentifier:
                         SimpleTableIdentifier];


      NSUInteger row = [indexPath row];

     cell.type.text = [portfolioArray objectAtIndex:row];

     return cell;
    }


    #pragma mark -
    #pragma mark Table Delegate Methods


    - (void)tableView:(UITableView *)tableView
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    NSString *rowValue = [portfolioArray objectAtIndex:row];

    NSString *message = [[NSString alloc] initWithFormat:
                     @"You selected %@", rowValue];
    UIAlertView *alert = [[UIAlertView alloc]
                         initWithTitle:@"Row Selected!"
                         message:message
                         delegate:nil
                         cancelButtonTitle:@"Yes I Did"
                         otherButtonTitles:nil];
    [alert show];

   [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }

 - (void)tableView:(UITableView *)tableView commitEditingStyle:                (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
        NSUInteger row = [indexPath row]
        [self.portfolioArray removeObjectAtIndex:row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]                 withRowAnimation:UITableViewRowAnimationAutomatic] ;
        }

我做错了什么?

2 个答案:

答案 0 :(得分:0)

两点:首先,UINavigationControllerUIViewController的子类,因此您可以创建一个UINavigationController实例,其rootViewController是您的tableViewController,并让TabBarController管理导航控制器为一个它的标签。

另请注意,UIViewController类已经具有editButtonItem属性,您应该使用该属性而不是创建自己的按钮:

 self.navigationItem.rightBarButtonItem = self.editButtonItem;

答案 1 :(得分:0)

好的,我想我弄清楚我做错了什么。我为我的选项卡视图控制器创建了一个nib文件,为此我添加了视图控制器和一个导航控制器(它本身包含一个tableview控制器)。

我没有做的一件事是将正确的类类型分配给我的选项卡中的视图控制器。如果我创建了一个具有IBOutlets的自定义视图控制器类firstviewcontroller,并且我没有将我的选项卡控制器nib中的视图控制器指定为类firstviewcontroller,那么我会得到那个奇怪的键值错误。

我遇到的第二个问题是标签视图控制器不会自动旋转,即使我想要显示的所有视图都允许使用以下代码进行自动旋转:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Return YES for supported orientations
     return YES;
    }

这样做的原因是我没有指定每个视图控制器的类(在我的tabbedviewcontroller nib文件中)是我希望它们显示的自定义类。

一旦我指定了他们的班级类型,一切都已落实到位。