加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 通过故事板和xcode正确创建手册

发布时间:2020-12-15 01:58:14 所属栏目:百科 来源:网络整理
导读:我是xcode的新手,而我正在尝试开发一个基本上是嵌入式表视图的示例应用程序,它具有与 this类似的许多级别。我有一个plist来存储每个tableview的单元格。如果单元格没有孩子,那么我希望能够在单元格被按下后进入一个详细的视图。最终,我想要根据数据类型
我是xcode的新手,而我正在尝试开发一个基本上是嵌入式表视图的示例应用程序,它具有与 this类似的许多级别。我有一个plist来存储每个tableview的单元格。如果单元格没有孩子,那么我希望能够在单元格被按下后进入一个详细的视图。最终,我想要根据数据类型去不同的详细视图。为此,我从故事板创建了一个详细的视图,拖动我的视图控制器到我的详细视图,创建一个手动“推”segue,并标记segue“segue1”。

编辑:源代码here

接下来我填充我认为是这个工作的必要功能,这是调用[self performSegueWithIdentifier:@“segue1”sender:myString];其中myString是我选择的单元格的标题。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Check the dictionary to see what cell was clicked
    NSDictionary *dict = [self.tableDataSource objectAtIndex:indexPath.row];
    NSString *myString = [dict objectForKey:@"Title"];
    NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];

    NSArray *children = [dictionary objectForKey:@"Children"];

    //If there is no children,go to the detailed view
    if([children count] == 0)
    {
        [self performSegueWithIdentifier:@"segue1" sender:myString];

    }
    else{
        //Prepare to tableview.
        DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];

        //Increment the Current View
        rvController.CurrentLevel += 1;

        //Set the title;
        rvController.CurrentTitle = [dictionary objectForKey:@"Title"];

        //Push the new table view on the stack
        [self.navigationController pushViewController:rvController animated:YES];

        rvController.tableDataSource = children;

    }

}

最后,我打电话准备segue,寻找标记为segue1的segue。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"segue1"])
    {
        DrillDownDetailController *dvController = [[segue destinationViewController] visibleViewController];
        //DrillDownDetailController *dvController = [[DrillDownDetailController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
        [dvController setItemName:(NSString *)sender];
        [self.navigationController pushViewController:dvController animated:YES];
    }
}

我以为这可以工作,但是由于某些原因,每当代码达到[self performSegueWithIdentifier:@“segue1”sender:myString];它会发生错误

*****由于未捕获的异常’NSInvalidArgumentException’终止应用程序,原因:’Receiver()没有标识符’segue1”
*第一次调用堆栈:
(0x14b4022 0xeb4cd6 0xdf61b 0x3590 0xa85c5 0xa87fa 0x93d85d 0x1488936 0x14883d7 0x13eb790 0x13ead84 0x13eac9b 0x139d7d8 0x139d88a 0x17626 0x23ed 0x2355 0x1)
终止调用抛出异常(lldb)

我不知道为什么告诉我它在故事板和代码中已经定义时找不到segue1。

解决方法

实际上有几个问题:

首先,在您为我们上传的项目中,segue不承担“segue1”标识符:

如果您还没有,您应该填写该标识符。

第二,当您从表视图推送到表视图时,您将调用initWithNibName来创建视图控制器。你真的想使用instantiateViewControllerWithIdentifier。

因此,说:

DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];

应该说:

DrillDownViewController *rvController = [self.storyboard instantiateViewControllerWithIdentifier:@"TableView"];

第三,你的prepareForSegue是:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"segue1"])
    {
        dvController = [[segue destinationViewController] visibleViewController];
        [dvController setItemName:self->nameToSend];
    }
}

而且应该简化为消除对visibleViewController的引用,例如:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"segue1"])
    {
        dvController = segue.destinationViewController;
        dvController.itemName = nameToSend;
    }
}

第四,你的DrillDownDetailController.m有这个方法:

-(void) setItemName:(NSString *)itemName
{
    if(!itemName)
    {
        itemName = [[NSString alloc] initWithString:itemName];
    }
    label.text = itemName;
}

这里有一些问题,但您不应该在此更新label.text(因为它可能还没有创建!)。你应该完全消除这个自定义设置器方法(只需让Xcode为您合成标准设置器),并将您的viewDidLoad更改为如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];

    label.text = self.itemName;
}

确保在viewDidLoad之前不更新UI对象!

我没有通过整个程序,但是通过这四个更正,我可以点击“SubItem1”,然后点“汽车”,然后再点“宝马”,看到一个说“宝马”的详细画面。我认为你的plist在其他项目上有一些问题(例如,鞋子的条目是字符串,而不是字典条目,你会收到一个错误…我假定你没有完全填写你的plist),但上面的修复纠正更重要的编码问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读