我目前有一个实质性工作的应用程序,我目前正在经历一个增强这个的学习过程。我有一个TableViewController,当系统提示时,要求用户输入一些信息,当用户单击“保存”时,该信息会在表格视图中正确显示。
我想要求用户添加一点信息,这将构成该部分。这将是日期。想想Instragram;在每张图片之前,你有一个日期等。我想实现类似的东西,其中输入的日期构成节标题,然后按时间顺序显示它们。
我还在学习,所以我真的不知道怎么做到这一点。我已经有一个数组(称为事务),它负责当前在表视图中显示所有内容。
我是否需要创建另一个数组来保存输入的日期?
我将如何实现这些方法:
sectionIndexTitlesForTableView
tableView:titleForHeaderInSection
我之前没有完成任何部分的实施,它让我失望了。
交易实体与其他一些实体有关系,偶尔就是其中之一。在TableCell中,我成功地显示了transaction.occasion的结果,它调用了Occasion实体并显示了它的名称等。该Occasion实体也有一个dateOfEvent属性,基本上,我希望section titles显示dateOfEvents with表示该日期事件的相应行。
非常感谢任何帮助!
P.S。我目前没有使用NSFetchedResultsController;我知道这更容易,但我想先这样学习..
答案 0 :(得分:3)
我知道回答已经太晚了。还是想在这里发表我的意见。
当我们使用核心数据存储数据和tableview来呈现它时,使用NSFetchedResultsController
总是有用且节省时间。
这是一个简单的场景,比如whatsapp,它会每天对所有消息进行分组并对每组消息进行排序:
数据模型:
Message<<------->Conversation
Message{
@NSManaged var body: String?
@NSManaged var seen: NSNumber?
@NSManaged var time: NSDate?
@NSManaged var uid: String?
@NSManaged var conversation: Conversation?
var sectionTitle: String? {
//this is **transient** property
//to set it as transient, check mark the box with same name in data model
return time!.getTimeStrWithDayPrecision()
}
}
将NSFetchedResultsController
初始化为:
let request = NSFetchRequest(entityName: "Message")
let sortDiscriptor = NSSortDescriptor(key: "time", ascending: true)
request.sortDescriptors = [sortDiscriptor]
let pred = NSPredicate(format: "conversation.contact.uid == %@", _conversation!.contact!.uid!)
request.predicate = pred
let mainThreadMOC = DatabaseInterface.sharedInstance.mainThreadManagedObjectContext()
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainThreadMOC, sectionNameKeyPath: "sectionTitle", cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
表格视图的数据源将是:
//MARK: Table view data source
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionInfo = fetchedResultsController.sections![section]
let n = sectionInfo.numberOfObjects
return n
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let sectionInfo = fetchedResultsController!.sections! as [NSFetchedResultsSectionInfo]
return sectionInfo[section].name
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let message = fetchedResultsController.objectAtIndexPath(indexPath) as! Message
let cell = tableView.dequeueReusableCellWithIdentifier(IncomingChatBubbleCell.identifier(), forIndexPath: indexPath) as! IncomingChatBubbleCell
configureCell(cell, indexPath: indexPath)
return cell
}
这将得到如下结果:
希望这会对你有帮助!!!
<强>更新强>
这是getTimeStrWithDayPrecision()
日期扩展方法的示例实现:
func getTimeStrWithDayPrecision() -> String {
let formatter = NSDateFormatter()
formatter.timeStyle = .NoStyle
formatter.dateStyle = .ShortStyle
formatter.doesRelativeDateFormatting = true
return formatter.stringFromDate(self)
}
答案 1 :(得分:0)
我不关心您是使用核心数据还是其他任何数据源。我的结论是您需要根据日期对场合进行分组。为此,您必须根据数据源(此处为numberOfOccasions)过滤场合。 dateOfOccasion属性。
我在这里发布一些示例代码来分组场合。 在头文件中声明字典对象,例如dicOccasions。
for(int i=0;i< numberOfOccasions;i++)
{
if(dicOccasions==nil)dicOccasions = [[NSMutableDictionary alloc] init];
NSString *key = [NSString stringWithFormat:@"%@",dateOfOccasion];
NSMutableArray *ArrTemp= (NSMutableArray*)[[dicOccasions objectForKey:key] mutableCopy];
if(ArrTemp==nil)ArrTemp = [[NSMutableArray alloc] init];
[ArrTemp addObject:[[numberOfOccasions objectAtIndex:i] copy]];
[dicOccasions setObject:[ArrTemp mutableCopy] forKey:key];
}
在tableview numberOfsections委托中,您可以使用dicOccasions的计数 在tableView numberOfRowsInSection中使用以下代码。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSString *key = [self getSalesOrderKey:section];
NSMutableArray * Arry = [dicOccasions objectForKey:key];
if([Arry isKindOfClass:[NSString class]])return 0;
return [Arry count];
}
-(NSString*)getSalesOrderKey:(int)section
{
NSArray *arr = [dicOccasions allKeys];
arr = [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
if (section<arr.count)return [arr objectAtIndex:section];
return nil;
}
在tableview的viewForHeaderInSecion委托中,您可以使用以下代码来获取dateOfOccasion
NSString *dateOfOccasion = [self getSalesOrderKey:section];
您可以在标签中显示它并显示为部分标题。