【问题标题】:iPhone: Grouped tables and navigation controller issuesiPhone:分组表和导航控制器问题
【发布时间】:2010-05-06 18:51:14
【问题描述】:

我已经在我的应用程序上设置了一个分组表,并且推送到新视图工作正常。除了一件事。标题和堆栈布局都很奇怪。这是细分:

  1. 我的表中有两个部分。
  2. 当我点击第一部分的第一行时,它会将我带到正确的视图,但新视图的标题是表格第二部分中第一行的名称。
  3. 反过来,第一节标题中的第二行是第二节标题中的第二行。

如果我点击根视图表第二部分的第二行,导航按钮会转到表的第一部分的第二行。

所以这是我的表格的图表:


表格第 1 节
第 1 行
第 2 行
第 3 行

表第 2 节
A行
B行
C行


所以如果我点击第 3 行,推送视图的标题是 C 行。导航按钮告诉我返回第 3 行,然后最终到达根视图。

这是我推送视图的实现文件:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //CSS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"CSS"])
    {
        CSSViewController *css = [[CSSViewController alloc] initWithNibName:@"CSSViewController" bundle:nil];
        [css setTitle:@"CSS"];
        [self.navigationController pushViewController:css animated:YES];
    }

    //HTML
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"HTML"])
    {
        HTMLViewController *html = [[HTMLViewController alloc] initWithNibName:@"HTMLViewController" bundle:nil];
        [html setTitle:@"HTML"];
        [self.navigationController pushViewController:html animated:YES];
    }

    //JS
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"JavaScript"])
    {
        JSViewController *js = [[JSViewController alloc] initWithNibName:@"JSViewController" bundle:nil];
        [js setTitle:@"JavaScript"];
        [self.navigationController pushViewController:js animated:YES];
    }

    //PHP
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"PHP"])
    {
        PHPViewController *php = [[PHPViewController alloc] initWithNibName:@"PHPViewController" bundle:nil];
        [php setTitle:@"PHP"];
        [self.navigationController pushViewController:php animated:YES];
    }

    //SQL
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"SQL"])
    {
        SQLViewController *sql = [[SQLViewController alloc] initWithNibName:@"SQLViewController" bundle:nil];
        [sql setTitle:@"SQL"];
        [self.navigationController pushViewController:sql animated:YES];
    }

& 提供表格数据的数组:

- (void)viewDidLoad {
    [super viewDidLoad];


    arryClientSide = [[NSArray alloc] initWithObjects:@"CSS",@"HTML",@"JavaScript",nil];
    arryServerSide = [[NSArray alloc] initWithObjects:@"Objective-C", @"PHP",@"SQL",nil];
    // arryResources = [[NSArray alloc] initWithObjects:@"HTML Colour Codes", @"Useful Resources", @"About",nil];
    self.title = @"Select a Language";
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

我们将非常感谢提供任何帮助。
杰克

【问题讨论】:

  • 神圣的内存泄漏,蝙蝠侠! (每次你alloc/init一个新的viewController,你应该在推送后release它)

标签: iphone objective-c uitableview uinavigationcontroller grouped-table


【解决方案1】:

我认为您缺少一个 if 语句来确定用户点击了哪个部分。记住 NSIndexPath 既有 row 又有 section 属性。我通常会这样做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ( indexPath.section == 0 ) {
  // Do something with arryClientSide
}
if ( indexPath.section == 1 ) {
  // Do something with arryServerSide
}

我假设您使用的是分组表。

干杯, -丹

【讨论】:

    【解决方案2】:

    Dan 是对的,您需要使用 indexPath.section 变量。看起来您的代码现在的样子,您实际上是在推送 2 个视图控制器,因为您有一系列单独的 if 语句,在您单击“第 1 行”后会发生以下情况:

    isEqual:@"CSS" 将返回 true,

    推送 css 视图控制器,

    然后下拉并继续检查 (if.​​. isEqual:@"HTML").. (if.​​. isEqual:@"JavaScript")

    那么果然(if..isEqual:@"PHP")也会返回true并推送php视图控制器。

    我不知道您的整个应用程序,但我注意到的一个观察结果(除了内存泄漏)是您有一个专用于每种语言的视图控制器/笔尖。如果视图控制器的行为/外观大不相同,那么我猜这就是你必须做的,但我建议你试着看看每个人之间有什么相似之处,看看你是否不能制作一个“LanguageViewController”,传递它应该代表的语言并进行初始化/设置属性基于此的视图控制器。这可能不适用,但如果适用,它将为您节省大量工作!

    【讨论】:

    • 关于你提到的最后一件事,我只需要一个可以控制所有语言的笔尖吗?当我创建视图控制器时,Xcode 为我创建了单独的 nib。然后我向视图控制器提供一个数组以创建另一个表。我可以从 plist 中提供每种编程语言的数据吗?然后我可以创建一个导航控制器来控制 plist 的每个项目吗?
    • 是的,这听起来像是一种情况,您只需制作一个“LanguageViewController”(和 nib),创建一个带有额外语言字符串参数的自定义 init 函数,然后在 init 函数中执行类似(以下当然是伪代码): if(language equals "CSS") 从 CSS.plist 加载数据; else if(language equals "HTML") 从 HTML.plist 加载数据;等等。不过只是一个建议,当有疑问时,做对你最有意义的事情。
    • 对,所以我只需将代码中的所有 initWithNibName 修改为新的 LanguageViewController nib?
    • LanguageViewController 将替换所有的 CSS/HTML/PHP/etc 视图控制器。在 LanguageViewController.m 创建一个初始化函数 - (id) initWithNibName:(NSString*)nibNameOrNil Language:(NSString*)lang;在该函数中,您将根据“lang”参数指定视图应从哪个 plist 获取其数据。你会在 didSelectRowAtIndexPath 中调用它,有点像这样: if(indexPath.section == 0) initWithNibName:@"LanguageViewController" lang:[arryClient objectAt:indexPath.row] 然后做类似的事情,但使用 arryServerSide for section==1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多