细节视图充满了plist信息

时间:2012-02-03 00:36:19

标签: ios uitableview uiview

我一直在关注iOS开发的教程 - 特别是深入研究UITableViews。我已经建立了自己的自定义plist,但我似乎无法使用我的plist信息填充DetailViewController。我真的可以在这里使用一些帮助,我有点过头了!

编辑:以下是一些细节......

该应用程序通过plist-filled状态的RootViewController工作,这是一个UITableView。如果plist中没有任何子项,则会更改为Detail视图:

AppDelegate.m

NSDictionary *tempDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]];
self.data = tempDict;

RootViewController.m

- (void)viewDidLoad
    {
        [super viewDidLoad];
        if(CurrentLevel == 0) { // At the 'root' of the plist

            //Initilalize our table data source
            NSArray *tempArray = [[NSArray alloc] init];
            self.tableDataSource = tempArray;

            AppDelegate *AppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];

            self.navigationItem.title = @"PedalTome";
        }
        else
            self.navigationItem.title = CurrentTitle;
    }

稍后......

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

        //Get the dictionary of the selected data source.
        NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];

        //Get the children of the present item.
        NSArray *Children = [dictionary objectForKey:@"Children"];

        if([Children count] == 0) {

            DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
            [self.navigationController pushViewController:dvController animated:YES];

        }
        else {

            //Prepare to tableview.
            RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" 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;

        }
    }

我的DetailViewController.m为空,占位符self.navigationController.title除外。

如果我理解正确,我需要将信息从RootViewController传递给DetailViewController - plist的位置和实现,即plist中的索引级别(就是它所称的),和索引级别内的字符串(在明细键下)。

此时,任何进展都是惊人的进步。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以通过在DetailViewController中设置合成媒体资源,然后在if-block中将数据传递给DetailViewController,将所需信息传递给DetailViewController.h

例如,在您的@property (retain, nonatomic) NSDictionary *myAwesomeDictionary; 中,您将拥有以下内容(没有ARC):

@property (strong, nonatomic) NSDictionary *myAwesomeDictionary;

或者,启用ARC:

DetailViewController.m

然后在@synthesize myAwesomeDictionary; 中,您将拥有以下内容:

if([Children count] == 0) {
    DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];

    [dvController setMyAwesomeDictionary:dictionary];

    [self.navigationController pushViewController:dvController animated:YES];
}

然后您将代码块更改为以下内容:

NSDictionary

这假设您在上面创建了几行的dictionary DetailViewController是您希望在DetailViewController中显示的数据。

然后,在viewDidLoad:的{​​{1}}方法中,您可以使用self.myAwesomeDictionary访问该词典,并执行您需要执行的操作。

声明:

在您的代码中,似乎有两件事违反了Apple的代码风格标准:

  1. 您的AppDelegate存储您的模型(您的plist)。 - Apple说你不应该把你的AppDelegate挤满全球数据/逻辑。通常,只编写与特定类中的类有关的代码。
  2. 您没有将plist解析为自定义对象。 - 这使代码变得困难,因为你经常需要弄清楚你的通用数组和字典对象代表什么,并使你的代码对其他人来说完全不可读。
  3. 您的某些实例变量名称是大写的。例如,NSArray *Children应为NSArray *childrenCurrentLevel应为currentLevel。只有班级名称的首字母大写。
  4. 查看http://jlawr3nc3.github.com - 特别是我的CompanyRecords示例代码,了解如何创建类以及如何将plist解析为自定义对象的FunWithArrays。 MusicLibraryiOS然后深入探讨如何获取一个plist,将其解析为自定义对象,然后将其与详细视图一起显示在UITableView中。

答案 1 :(得分:0)

Table View Specifier可以做你需要的。

  

指定表视图是指定了其内容的iOS表视图   通过plist文件。它的目的很大程度上是示范性的,但也是设计的   用于实时产品(对于信用页面有用)。可以搭配使用   iOS 4.2及更高版本。

通过他们的代码挖掘很可能具有启发性。