• Note_Master-Detail Application(iOS template)_05_ YJYMasterViewController.m


    //  YJYMasterViewController.m

    #import "YJYMasterViewController.h"

    #import "YJYDetailViewController.h"

     /*

    @interface:接口,提供类的公共描述,接口里面包含了使用该类的所需信息,编译此部分后,就能够使用该的对象及调用类方法。

    @implementation:实现,告诉编译器如何让该类工作,实现了接口中声明的方法。

    代码分为接口和实现两部分,

    接口部分包含:@interface指令、公共struct定义、enum常量、@defines和extern全局变量等。

    实现部分包含:@implementation指令、全局变量的定义、私有struct等。

    #import:导入头文件:头文件包含元素声明(如,结构体、符号常量、函数原型等),#import同c语言中的#include类似,它们的区别在于,在c语言中,通常使用#ifdef命令来避免一个头文件包含另一个文件,而#import可保证头文件只被包含一次。

    带尖括号语句用来导入系统头文件(只读),带引号的语句用来导入项目本地头文件(可读)。

    */

    @interface YJYMasterViewController ()

    - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;

    @end

    @implementation YJYMasterViewController

     /*

    当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的 awakeFromNib函数来响应这个消息,

    执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib

    */

    - (void)awakeFromNib

    {

        self.clearsSelectionOnViewWillAppear = NO;

        self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);

        [superawakeFromNib];

    }

    //当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad

    - (void)viewDidLoad

    {//释放视图资源

        NSLog(@"viewDidLoad() begin...");

        [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

        self.navigationItem.leftBarButtonItem = self.editButtonItem;

        UIBarButtonItem *addButton = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:selfaction:@selector(insertNewObject:)];

        self.navigationItem.rightBarButtonItem = addButton;

        self.detailViewController = (YJYDetailViewController *)[[self.splitViewController.viewControllerslastObject] topViewController];

        NSLog(@"viewDidLoad() over...");

    }

    - (void)didReceiveMemoryWarning

    {

        NSLog(@"didReceiveMemoryWarning() begin...over");

        [superdidReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

    - (void)insertNewObject:(id)sender

    {

        NSLog(@"insertNewObject() begin...");

        NSManagedObjectContext *context = [self.fetchedResultsControllermanagedObjectContext];

        NSEntityDescription *entity = [[self.fetchedResultsControllerfetchRequest] entity];

        NSManagedObject *newManagedObject = [NSEntityDescriptioninsertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

        

        // If appropriate, configure the new managed object.

        // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.

        [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];

        

        // Save the context.

        NSError *error = nil;

        if (![context save:&error]) {

             // Replace this implementation with code to handle the error appropriately.

             // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

            abort();

        }

        

        NSLog(@"insertNewObject() over...");

    }

    #pragma mark - Table View

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    {

        NSLog(@"numberOfSectionsInTableView being...over");

        return [[self.fetchedResultsControllersections] count];

    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

        NSLog(@"tableView numberOfRowsInSection() beging...");

        id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];

        NSLog(@"tableView numberOfRowsInSection() over...");

        return [sectionInfo numberOfObjects];

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        NSLog(@"tableView cellForRowAtIndexPath() beging...");

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"forIndexPath:indexPath];

        [self configureCell:cell atIndexPath:indexPath];

        NSLog(@"tableView cellForRowAtIndexPath() over...");

        return cell;

    }

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

    {//该方法控制master区的可编辑(删除)操作

        // Return NO if you do not want the specified item to be editable.

        return YES;

    }

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

    {

        if (editingStyle == UITableViewCellEditingStyleDelete) {

            NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

            [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

            

            NSError *error = nil;

            if (![context save:&error]) {

                 // Replace this implementation with code to handle the error appropriately.

                 // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

                abort();

            }

        }   

    }

    - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

    {

        // The table view should not be re-orderable.

        returnYES;

    }

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

    {

        NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];

        self.detailViewController.detailItem = object;

    }

    #pragma mark - Fetched results controller

    - (NSFetchedResultsController *)fetchedResultsController

    {

        if (_fetchedResultsController != nil) {

            return_fetchedResultsController;

        }

        

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

        // Edit the entity name as appropriate.

        NSEntityDescription *entity = [NSEntityDescriptionentityForName:@"Event"inManagedObjectContext:self.managedObjectContext];

        [fetchRequest setEntity:entity];

        

        // Set the batch size to a suitable number.

        [fetchRequest setFetchBatchSize:20];

        

        // Edit the sort key as appropriate.

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];

        NSArray *sortDescriptors = @[sortDescriptor];

        

        [fetchRequest setSortDescriptors:sortDescriptors];

        

        // Edit the section name key path and cache name if appropriate.

        // nil for section name key path means "no sections".

        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsControlleralloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContextsectionNameKeyPath:nilcacheName:@"Master"];

        aFetchedResultsController.delegate = self;

        self.fetchedResultsController = aFetchedResultsController;

        

    NSError *error = nil;

    if (![self.fetchedResultsControllerperformFetch:&error]) {

        // Replace this implementation with code to handle the error appropriately.

        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

        abort();

    }

        

        return_fetchedResultsController;

    }    

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller

    {

        [self.tableViewbeginUpdates];

    }

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo

               atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type

    {

        switch(type) {

            caseNSFetchedResultsChangeInsert:

                [self.tableViewinsertSections:[NSIndexSetindexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

                break;

                

            caseNSFetchedResultsChangeDelete:

                [self.tableViewdeleteSections:[NSIndexSetindexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

                break;

        }

    }

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject

           atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type

          newIndexPath:(NSIndexPath *)newIndexPath

    {

        UITableView *tableView = self.tableView;

        

        switch(type) {

            caseNSFetchedResultsChangeInsert:

                [tableView insertRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationFade];

                break;

                

            caseNSFetchedResultsChangeDelete:

                [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

                break;

                

            caseNSFetchedResultsChangeUpdate:

                [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];

                break;

                

            caseNSFetchedResultsChangeMove:

                [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

                [tableView insertRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationFade];

                break;

        }

    }

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

    {

        [self.tableViewendUpdates];

    }

    /*

    // Implementing the above methods to update the table view in response to individual changes may have performance implications if a large number of changes are made simultaneously. If this proves to be an issue, you can instead just implement controllerDidChangeContent: which notifies the delegate that all section and object changes have been processed. 

     

     - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

    {

        // In the simplest, most efficient, case, reload the table view.

        [self.tableView reloadData];

    }

     */

    - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

    {

        NSLog(@"configureCell atIndexPath() begin...");

        

        NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

        cell.textLabel.text = [[object valueForKey:@"timeStamp"] description];

        NSLog(@"configureCell atIndexPath() over...");

    }

    @end

  • 相关阅读:
    Linq分组后,再对分组后的每组数据进行排序,获取每组的第一条记录
    C/C++ 常量存储: 总结
    张庆科(山师大硕导简介) [转载]
    composer [packagist]包制作(入门篇)
    MMGCN: Multi-modal Graph Convolution Network for Personalized Recommendation of Micro-video
    opencv.js编译
    推荐
    推荐
    推荐
    Azure Automation (10) 在Automation中动态修改Azure Analysis Firewall防火墙规则
  • 原文地址:https://www.cnblogs.com/allearner/p/3623110.html
Copyright © 2020-2023  润新知