- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用 uitableviews 深入查看 plist 以获取特定学校。向下钻取状态->地区->学校。我创建了一个 plist,但我不能 100% 确定该结构是最好的。此外,我可以在第一个 tableview 上获得第一组事件信息,但我不确定如何从那里继续。我是否需要为每个向下钻取(stateview、districtview、schoolview)创建一个 TableView ,或者我可以重用一个通用的 TableView ,因为它们将简单地是列表?以下是我到目前为止所拥有的。感谢您的帮助。
PLIST
<plist version="1.0">
<array>
<dict>
<key>districts</key>
<dict>
<key>District 1</key>
<array>
<string>School 2</string>
<string>School 1</string>
</array>
<key>District 2</key>
<array>
<string>School 3</string>
<string>School 4</string>
</array>
</dict>
<key>state</key>
<string>South Dakota</string>
</dict>
<dict>
<key>districts</key>
<array>
<string>District 1</string>
<string>District 2</string>
</array>
<key>state</key>
<string>Arkansas</string>
</dict>
<dict>
<key>districts</key>
<array>
<string>District 3</string>
<string>District 4</string>
</array>
<key>state</key>
<string>New York</string>
</dict>
</array>
</plist>
这是我的 View Controller
#import "plistViewController.h"
@interface plistViewController ()
@end
@implementation plistViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
}
return self;
}
@synthesize content = _content;
-(NSArray *)content
{
if (!_content) {
_content = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]];
}
return _content;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.content count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [[self.content objectAtIndex:indexPath.row] valueForKey:@"state"];
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
}
@end
最佳答案
UITableView 最好的地方在于它不关心显示什么数据。它只是询问它的委托(delegate)
几个不同的问题:
因此,您必须专注于让您的委托(delegate)响应提供正确的数据。
因此,首先将您的 plist 分成可管理的 block 。 UITableView prima-donna 数据源是一个 NSArray。由于索引逻辑,可以整齐地映射到 tableView。
也就是说,您的第一个 tableViewController plistViewController
具有良好的显示信息逻辑。具体来说,您在数组位置 x
处查询 NSDictionary 并要求它返回其 state
对象。 3 个字典对象,返回 3 个字符串。不错。
那么如何进入下一个级别呢?你的 tableView 会在这里帮助你。它向其 delegate
询问一个特定问题:
您将需要设置另一个名为 DistrictViewController
的 UITableViewController 子类。在 header .h
文件中,您需要为 NSDictionary
对象创建一个 strong
属性。像这样:
//DistrictViewController.h
@interface DistrictViewController : UITableViewController
@property (nonatomic, strong) NSDictionary *districtDictionary;
@end
//DistrictViewController.m
@implementation DistrictViewController
@synthesize districtDictionary;
我们已经有了。此类现在设置为跟踪 1 个 NSDictionary 对象。现在您只需配置您的表委托(delegate)方法来显示您想要的数据。
第一个示例,NSArray 的顶行 (index:0) 中的内容,您有一个包含 2 个键的字典:District 1
和 District 2
。但这是一个问题。 NSDictionary 不能很容易地映射到 TableView,因为 NSDictionary 对象不使用索引来工作。别担心。 NSDictionary 有一个名为 allKeys
的方法,它将为您提供字典中每个键的数组。当您将从某处接收 NSDictionary 但事先不知道它包含什么键时,这很有用。
那么,让我们回答您的 tableView 提出的问题:
//How many sections will be in me: Let's just say 1 for now.
//How many rows will be in this section:
//Ask the NSDictionary how many keys it has:
NSArray *keyArray = [self.districtDictionary allKeys];
return [keyArray count];
//Give me a tableCell for index path X,Y
//First, get your array of keys back:
NSArray *keyArray = [self.districtDictionary allKeys];
//Next, find the key for the given table index:
NSString *myKey = [keyArray objectAtIndex:indexPath.row];
//Finally, display this string in your cell:
cell.textLabel.text = myKey;
在此之后,您将为最终 View 执行相同的操作。为学校设置一个 viewController 并将其命名为 SchoolViewController
并将其设置为负责 NSArray。就像以前一样:
@interface SchoolViewController : UITableViewController
@property (nonatomic, strong) NSArray *schoolArray;
@end
@implementation SchoolViewController
@synthesize schoolArray;
在这个 View 中,它会很像第一个。你只需让这个 viewController 像以前一样回答表格的问题:
return [schoolArray count];
cell.textLabel.text = [schoolArray objectAtIndex:indexPath.row];
将所有这些放在一起的最后一部分是表格提出的最后一个问题。
在每个 View 中,查看此方法签名:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
这是您添加逻辑以连接事物的地方。在第一个 View plistViewController
中,执行以下操作:
NSDictionary *topLevelDictionary = [self.content objectAtIndex:indexPath.row];
NSDictionary *allDistricts = [topLevelDictionary objectForKey:@"districts"];
DistrictViewController *dView = [[DistrictViewController alloc] initWithStyle:UITableViewStylePlain];
dView.districtDictionary = allDistricts;
[self.navigationController pushViewController:dView animated:YES];
在第二个 View 中,DistrictViewController
这样做:
NSArray *keyArray = [self.districtDictionary allKeys];
NSString *myKey = [keyArray objectAtIndex:indexPath.row];
NSArray *schoolArray = [self.districtDictionary objectForKey:myKey];
SchoolViewController *sView = [[SchoolViewController alloc]initWithStyle:UITableViewStylePlain];
sView.schoolArray = schoolArray;
[self.navigationController pushViewController:sView animated:YES];
希望对您有所帮助。我在纯文本编辑器中输入了所有内容。希望没有拼写错误。您需要在每个 View Controller 中 #import 关联的 View Controller !祝你好运。
关于ios - 如何使用 UITableViews 向下钻取 plist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321438/
我正在使用面部跟踪进行 HCI(人机交互)。我正在尝试使用面部控制 PC。 我有 3x3 二维网格按钮。1 2 34 5 67 8 9 假设,当前焦点在按钮 5 上。如果我按向上箭头,则焦点将在 2
我正在为蛇和梯子制作一 block 板,到目前为止,我已经按降序打印了板。但是,我需要以正确的方式打印电路板。 编辑“螺旋下降”意味着 100...91 81...90 80...71 ...
我有一个可以响应式调整大小的菜单,因此每次调整大小时 div (#menuWFhover) 的内容都会重新排列,因此 div 根据窗口大小具有不同的高度。 当我使用 jQuery slideDown/
我们从服务器获取数据并附加 ListView 。我们的问题是,当向上/向下滚动时,它首先显示白屏,然后显示数据。向下/向上滚动时,之前出现的白屏应删除 for (var i=0; i");
我想要一个汉堡图标动态改变颜色的代码,以适应网站的黑色部分/部分和白色。它最初是 3 段白色,js 代码几乎是好的和正确的,但是当它在白色部分时它一直闪烁,并在红色和白色之间闪烁。 js var to
我对点击事件的页脚位置有疑问。我正在使用 bootstrap css,我有一个可折叠元素(bootstrap 中的 Accordion ),当它折叠时它有一个名为 .accordion-toggle.
在此代码段中,使用关键帧和动画并显示无/ block ,div 动画以在悬停时向下滑动。 h1 { padding: 20px; } div { width: 100%; background
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我正在尝试就地缩小文件。 我正在用另一个文件的内容替换一个文件的内容,完成后我想确保源文件是否小于目标文件,目标文件是否正确收缩。 (为什么:因为dest文件是一个备份,写入media的开销很大,所以
似乎每当我用一个负整数除以一个正整数时,我都需要它向下舍入 (向 -inf),而不是向 0。但 C# 和 C++ 都向 0 舍入。 所以我想我需要一个 DivideDownward() 方法。我可以用
考虑这个简单的代码: document.addEventListener( 'keypress', function() { console.log( 'press' ); } ); document
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
我见过几个recyclerview的无限滚动示例,但它们都是向下滚动的。 我想要的是一次又一次地加载我的列表,但无论用户是从上面还是从下面滚动。 正常列表 向上滚动 向下滚动 这样可以通过无限滚动一遍
我正在使用带有 View 的 drupal 7,并且我正在使用我发现的向上/向下文本幻灯片的 jquery 脚本。它有效,但是当我尝试将它与带有 ajax 的 View 公开过滤器一起使用时,它似乎不
*场景 我希望制作一个类似于本网站上的 jquery 效果,它位于主 Flash 添加的右侧: http://www.commbank.com.au/ *问题 我已经开始了,但是用很多方法遇到了一些障
互联网。如果这与其他人没有什么关系,请原谅我,但我会将其留在这里,以防这是一个有效的问题。 我正在尝试创建一个文本区域字段,其中用户每次按下键(a-z),都会触发背景颜色更改(在数组中列出)。我一直在
我正在创建一个网络前端来控制一个小型机器人。 Ajax 调用将在 keydown 上进行,以启动机器人,并在 keyup 上进行停止。 我的问题是,当按下某个键时,keyup、keydown 和 ke
我在内容容器中有两个 div,一个向左浮动,另一个向右浮动。我正在使用屏幕的整个宽度。左 div 宽度为 1290px,右 div 宽度为 625px。有时,在加载页面时,滚动条会更改可用屏幕宽度的宽
请看这个UI sketch图片,我在某个站点的侧边栏(黑框)中有这个 div,当我向下滚动或向上滚动时,我不希望它隐藏...我希望它在我向下滚动和移动时自行向下移动当我向上滚动时向上滚动,这样它就永远
我是一名优秀的程序员,十分优秀!