【问题标题】:Xcode 4.2 Snowleopard Master-Detail Application troubleshootingXcode 4.2 Snowleopard Master-Detail 应用程序故障排除
【发布时间】:2012-03-24 16:34:09
【问题描述】:

我是 iOS 应用程序开发的菜鸟。
我试图创建“UITableView -> to Detail View”应用程序。
并在工程模板中找到“Master-Detail Application”工程。

然后我试了一下。然后问题来了。 我有一个动态表视图,所以我必须让详细视图看起来也动态。 像这样:

Table View      Detail View
  Item A            Item A is an <item_A_description>, with <item_A_summary>
  Item B            Item B is an <item_B_description>, with <item_B_summary>
  Item C            Item C is an <item_C_description>, with <item_C_summary>

问题是,在我使用后退按钮菜单返回表格(列表)视图后, 然后我再次从列表的不同行中选择项目,然后详细视图不会更改为选定的项目值。
我确实使用 (MasterView) -> initWithNibName -> (DetailView)
传递了值 我的环境:XCode 4.2 for SnowLeopard,iOS SDK 5

更新
在我检查日志后,参数值确实以正确的值传递。但是我设置的 UIlabel 的 IBOutlet 并没有改变它的值。
这是我的代码:

MasterViewController.m:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    TheItems *a = [data objectAtIndex:[indexPath row]];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        if (!self.detailViewController) {
            self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPhone" bundle:nil withItemId:(NSString *)a.itemId];
        }
        [self.navigationController pushViewController:self.detailViewController animated:YES];
        [self.detailViewController release];
    }
}

DetailViewController.h:

@interface metapsDetailViewController : UIViewController <UISplitViewControllerDelegate>
{
    NSString *itemId;
}
@property (strong, nonatomic) IBOutlet UILabel * detailItem;
@property (nonatomic, retain) NSString *itemId;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withItemId:(NSString *)itemId;

DetailViewController.m:

@synthesize detailItem = _detailItem;
@synthesize itemId;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withItemId:(NSString *)itemId
{


    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Detail", @"Detail");
        self.itemId = itemId;
    }
}

- (void)viewDidLoad
{
    self.detailItem.text = self.itemId;
}

谢谢

【问题讨论】:

    标签: objective-c ios xcode4.2 osx-snow-leopard


    【解决方案1】:

    只有在 detailViewController 不存在时才创建它。您提供给 detailViewController 的 Item 在您的 init 中,因此该项目只会设置一次。您应该向您的 detailViewController 添加一个方法(或属性),您可以在其中设置项目,以便在您获取新数据时它可以更改您的 detailViewController。

    编辑:实现类似这样的东西:

    @synthesize itemId = _itemId;
    
    -(void)setitemId:(NSString*)itemId{
    
        if(_itemId != itemId)
        {
            [_itemId release];
            _itemId = [itemId retain];
            self.detailItem.text = _itemId;
        }
    }
    

    【讨论】:

    • 感谢您的回答。是的,实际上我尝试在 DetailViewController 中使用一个属性,并通过该属性 self.detailViewController.itemId = a.itemId; 在 MasterViewController 的 didSelectRowAtIndexPath 上传递值...但它也没有工作
    • 你应该在 detailViewController 中实现标签更改,查看编辑。
    • 谢谢,我试试这个。
    • 我有一个问题,如果我有很多标签或 UIImage,我应该为所有 ui 元素实现该方法吗?
    • 代码在DetailViewController中。那里有一个属性 itemId。这个方法只是在实现中,它是itemId属性的setter的自定义实现。然后,您只需要 itemId,一旦获得 itemId,您就开始加载所需的所有数据。因此,您必须调用方法来开始加载项目,而不是设置标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2022-12-15
    • 2012-01-10
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多