gpt4 book ai didi

ios - 使用 NSUserdefaults 填充 UITableView

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:34 25 4
gpt4 key购买 nike

为了让 tableview 正常工作,我已经尝试了一段时间。每天我都取得了一点进步,但我无法通过测试应用程序看到任何类型的反馈,所以我不确定我是否正确地做某事。

我在谷歌上搜索了一段时间,查看了苹果文档,但我仍然不明白如何正确填充 UITableView。

第一个问题。我从哪里得到细胞?我需要制作一个自定义单元格来显示数据。该解决方案似乎使用了 nib,但我如何将它加载到另一个 View Controller 上?

第二个问题。这个单元格显然应该有动态内容。这些内容将从用户默认设置中获取(我可以这样做),但我不知道如何访问 Nib 中的标签来实现这一点。

第三个问题。我想要不同的部分(每个部分都有不同类型的单元格来显示),具有不同的页眉/页脚。与往常一样,我发现这里缺少文档。我怎样才能做到这一点?

第四,也是最重要的问题。我不知道如何加载细胞。显然这是由 cellForRowAtIndexPath 完成的,但我不确定它是如何做到的。

最后,这是代码(连同堆栈跟踪)。希望您能够帮助我。 请不要关闭此副本。首先,它不应该,其次,如果重复的问题是在 3 年多以前提出的,那么它不是重复的,因为库已经更新了多少。

#import "profileViewController.h"
#import "../Objs/CCProfileObject.h"

@interface profileViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) IBOutlet UITableViewCell *proxySampleCell;
@property (strong, nonatomic) IBOutlet UITableViewCell *ccSampleCell;
@end

@implementation profileViewController
@synthesize tableView;

- (void)viewDidLoad{
// Dark mode, you can skip all of this
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(changeColor:)
name:@"darkToggle" object:nil];

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if([userDefaults boolForKey:@"darkMode"] == YES){
[self changeColor:nil];
}

}

- (void)viewDidAppear:(BOOL)animated{

// Display profiles
NSData *arrayData = [[NSUserDefaults standardUserDefaults] objectForKey:@"profileArray"];
NSArray *profiles = [NSKeyedUnarchiver unarchiveObjectWithData:arrayData];

for(NSObject *profile in profiles){
if([profile class] == [CCProfileObject class])
{
CCProfileObject *ccProfile = (CCProfileObject*) profile;
printf("%s\n", [ccProfile.getName UTF8String]);
// Retrieve info from the object
// Duplicate cell
// Change appropriate labels
// Add cell to a specific section
}
// Different types of cells will be added later
// Concept is the same, what changes is the specific section and cell to duplicate

}
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if(indexPath.section == 1){
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reusableShippingCell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"reusableShippingCell"];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

cell.textLabel.text = @"aldo";

return cell;
}



return nil;
}
// This should be the only part that actually works (I use the same class twice because proxy and shipping are not yet done)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
// Display profiles
NSData *arrayData = [[NSUserDefaults standardUserDefaults] objectForKey:@"profileArray"];
NSArray *profiles = [NSKeyedUnarchiver unarchiveObjectWithData:arrayData];
NSMutableArray *sectionData = [[NSMutableArray alloc]init];

for(NSObject *profile in profiles){
// Credit
if([profile class] == [CCProfileObject class])
{
[sectionData insertObject:@1 atIndex:0];
}
// Shipping
else if([profile class] == [UIImage class])
{
[sectionData insertObject:@1 atIndex:1];
}
// Proxy
else if([profile class] == [UIImage class])
{
[sectionData insertObject:@1 atIndex:2];
}
}

int toReturn = 0;
for(int i = 0; i < [sectionData count]; i++){
toReturn += [[sectionData objectAtIndex:i] integerValue];
}
return toReturn;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// Credit card section
if(section == 0){
return 1;
} else if (section == 1){
return 2;
} else {
return 3;
}
}

`Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.52.10/UITableView.m:9453
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x16106d000; frame = (0 0; 375 812); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x1d0243bd0>; layer = <CALayer: 0x1d0030f60>; contentOffset: {0, -88}; contentSize: {375, 117}; adjustedContentInset: {88, 0, 83, 0}>) failed to obtain a cell from its dataSource (<profileViewController: 0x15ff14c70>)
First throw call stack:
(0x1837f6d8c 0x1829b05ec 0x1837f6bf8 0x1841e6fa0 0x18d4975b0 0x18d4941e8 0x18d493e00 0x18d492b1c 0x18d48e668 0x18d3cb770 0x18796d25c 0x1879713ec 0x1878ddaa0 0x1879055d0 0x18d7b56b4 0x18379f2bc 0x18379ea7c 0x18379c7b0 0x1836bcda8 0x18569f020 0x18d69d78c 0x1048a4f90 0x18314dfc0)
libc++abi.dylib: terminating with uncaught exception of type NSException

您不需要用一个答案解决我所有的问题。即使解决问题/解释我需要做什么就足够了,因为这至少能让我向前迈进一点。

最佳答案

首先,您不需要为 UITableViewCell 使用自定义 Nib ,除非您有一个非常复杂的单元格。相反,您可以使用 UITableViewAttributes inspector 中的 Prototype Cells 直接设计您的单元格布局。只需给 Prototype Cells 一个数字并在 UITableView View 中设计适当的单元格布局。不要忘记为它们中的每一个设置 identifier,这将帮助您在 cellForRowAtIndexPath 中加载正确的布局。

对于简单的单元格布局,您可以为单元格的每个元素提供一个标签 编号。这将帮助您在需要时访问它们,如下所示:

UILabel *label = [cell viewWithTag:100];

每个 UITableView 都需要一个 DataSource,您将实现 UITableViewDataSource 以提供:

  1. 表格的部分数
  2. 每个部分的项目数
  3. 单个单元格的内容

您只是在提供的源代码中执行了此操作,除了一件事:cellForRowAtIndexPath 需要返回一个 UITableViewCell,而不是 nil。如果返回nil,将抛出异常。

因此,有效的 cellForRowAtIndexPath 可能如下所示:

@implementation ViewController {
NSArray *data;
}

- (void)viewDidLoad {
[super viewDidLoad];

// You load your data from NSUserDefault here
data = [self loadDataFromNSUserDefault];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"defaultCell";
if (indexPath.section == 0) {
cellIdentifier = @"customCell1";
} else if (indexPath.section == 1) {
cellIdentifier = @"customCell2";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

// Access your view's children using their `tag`
UILabel *title = [cell viewWithTag:100];
UIImageView *icon = [cell viewWithTag:101];

// Set content
title.text = [[data objectAtIndex:indexPath.row] objectForKey:@"title"];
icon.image = [UIImage imageNamed:[[data objectAtIndex:indexPath.row] objectForKey:@"icon"]];

return cell;
}

关于ios - 使用 NSUserdefaults 填充 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52580235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com