iOS开发-------简单通讯录(UITableView和CoreData的应用)

IOS通讯录一样的TableView实现 iphone上通讯录一样的UITableView实现,字母分组,滚动条显示字母列表,点击跳转到对应的分组,官方例子 立即下载

       最近在学习数据持久化,总体来讲,说繁琐是因为他突然出现了很多我们没有见到过的类型,简单的是 他的逻辑很单一,基本每次用的步骤都是一样的,这两天练习数据持久化,并结合FRC做了一个简单的通讯录。与其在以后的复习博客中提及,不如在当下边写边复习。

       在之前我们不管是从plist中取数据,还是从本地文件中获取数据都是通过先定义一个全局数据的数组来接收,并通过下标来一个一个的取值来显示在tableView中,这样做也是可以的,但是注意的是,我们每次这么做完,都需要记住两点不要忘记:


1、修改上下文对象 NSManagedObjectConext(之前看到学长写的一篇博客,简单的就可以理解为类似 java-web的 session 属性,用来长期保存数据的,也可以理解为一个环境,所有的操作都是在这个环境下进行的)


2、更新tableView.loadView(如果不刷新tableView,那么只能在下次打开的时候才能显示修改过的数据)


FRC是什么呢,我简单的理解就是UIFetchedResultsController, 它的作用就是在 coredata 文件和 tableView 的中间架起来一个桥梁,就是随时从 环境中(NSManagedObjectContext)中获取数据,并通过回调方法,来实现对tableView的动态更新。


当然布局的工作依旧交给storyboard来解决,起始位置是一个UINavigationController(导航视图,以后会在复习博客中说到),结构如下

接下来是coreData的文件,新建方法也在上一篇文章中细说过了:

  


然后是 自动创建的实体类,(如何创建,上一文章中已经提及了)

//
//  People.h
//  简易通讯录001
//
//  Created by YueWen on 15/9/11.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface People : NSManagedObject

@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSData * image;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * tele;
@property (nonatomic, retain) NSString * firstWord;

@end
//
//  People.m
//  简易通讯录001
//
//  Created by YueWen on 15/9/11.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import "People.h"
#import "Pinyin.h"


@implementation People

@dynamic address;
@dynamic image;
@dynamic name;
@dynamic tele;
@dynamic firstWord;

@end



语言很是苍白无力,先留一下运行效果,后面附上代码

上面提到了,首先是一个UINavigationController(导航栏),导航栏的根视图是自带的一个UITableViewController,并用的自定义cell,因为原始的风格实在是太难看了,以下是这个页面的代码:(因为头文件中没有任何的东西,所以只给出实现文件)


//
//  ContactsTVController.m
//  简易通讯录
//
//  Created by YueWen on 15/9/10.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import "ContactsTVController.h"
#import "AddContactVController.h"
#import <CoreData/CoreData.h>
#import "People.h"
#import "UpdataContactVController.h"
#import "MyCell.h"

@interface ContactsTVController ()<NSFetchedResultsControllerDelegate>

@property (nonatomic, strong) NSManagedObjectContext * mangaedOjectContext;//上下文对象
@property (nonatomic, strong) NSFetchedResultsController * fetchResultsController;

@end

@implementation ContactsTVController


#pragma mark - 配置数据
-(void)loadMyFetchResultsController
{
    /***************配置fetchResultsController************/
    
    //创建请求
    NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:NSStringFromClass([People class])];
    
    //创建一个排序描述
    NSSortDescriptor * sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstWord" ascending:YES];
    
    //加在排序
    [request setSortDescriptors:@[sortDescriptor]];
    
    //创建fetchResultsController
    self.fetchResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:self.mangaedOjectContext sectionNameKeyPath:@"firstWord" cacheName:nil];
    
    
    //执行fetchResultsController
    NSError * error;
    if (![self.fetchResultsController performFetch:&error])
    {
        NSLog(@"%@",[error localizedDescription]);
    }
    
    //设置fetchResultsController的代理
    self.fetchResultsController.delegate = self;
}


#pragma mark - 添加联系人的目标动作回调
- (IBAction)addContact:(UIBarButtonItem *)sender
{
    //获取storyboard
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
    //从storyboard中获得添加联系人的页面
    UINavigationController * addContactNVController = [storyboard instantiateViewControllerWithIdentifier:@"addContactNVController"];
    
    //以模态的形式跳出
    [self presentViewController:addContactNVController animated:YES completion:nil];
    
}


#pragma mark - 默认的加载方法
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置标题
    self.navigationItem.title = @"通讯录";
    
    //设置左上角的编辑 bar button item
    self.navigationItem.leftBarButtonItem = self.editButtonItem;
    
    //获取该应用的上下文对象
    self.mangaedOjectContext = [self applicationManagedObjectContext];
    
    //配置fetchResultsController数据
    [self loadMyFetchResultsController];
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


当然,作为要使用tableView,那么我们必须要给他数据源,以下是实现tableView data source 的方法

#pragma mark - Table view data source

//返回的是tableView的分组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    //获取fetchResultsController的所有组
    NSArray * sections = [self.fetchResultsController sections];
    
    return sections.count;
}

//返回的是每组 的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    //获取fetchResultsController的所有的组
    NSArray * sections = [self.fetchResultsController sections];
    
    //获取每组的信息
    id <NSFetchedResultsSectionInfo> section0 = sections[section];
    
    return [section0 numberOfObjects];
}


//返回的是每个cell的显示的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString * indenfifier = @"MyCell";
    
    //获取模型对象
    People * people = [self.fetchResultsController objectAtIndexPath:indexPath];
    
    //创建MyCell,是自定义的cell
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:indenfifier forIndexPath:indexPath];
    
    //设置cell右侧的小箭头
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    
    //为cell赋值
    cell.titleImage.image = [UIImage imageWithData:people.image];
    cell.nameLabel.text = people.name;
    cell.teleLabel.text = people.tele;
    
    return cell;
}

//设置头标
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    //获得所有的sections
    NSArray * sections = [self.fetchResultsController sections];
    
    //返回title
    return [sections[section] name];
}

那么FRC是如何感知自己的改变,从而改变tableView的呢,首先是要遵守他的协议<NSFetchedResultsControllerDelegate>,方法呢,就是按住Option键进入帮助文档,复制粘贴,稍作修改即可

#pragma mark - 实现 NSFetchResultsControllerDelegate 的方法

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    //tableView开始更新
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    
    switch(type) {
        //如果是加入了新的组
        case NSFetchedResultsChangeInsert:
            //tableView插入新的组
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                          withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        //如果是删除了组
        case NSFetchedResultsChangeDelete:
            //tableView删除新的组
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex: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) {
        //如果是组中加入新的对象
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
        //如果是组中删除了对象
        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
        //如果是组中的对象发生了变化
        case NSFetchedResultsChangeUpdate:
            //**********我们需要修改的地方**********
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //如果是组中的对象位置发生了变化
        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    //用自己算好的最有算法,进行排列更新
    [self.tableView endUpdates];
}


当然自定义表格的高 都 为60,那么我们就通过一个方法来统一实现设置cell的高度

#pragma maek - 实现 UITableViewConrollerDelegate 方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}

如果想通过点击该行进入修改页面呢,就实现以下方法

//点击tableView中的元素执行的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //获取模型对象
    People * people = [self.fetchResultsController objectAtIndexPath:indexPath];
    
    //获取stroyboard
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
    //创建一个 UpdataContactVController 准备跳转
    UpdataContactVController *  updataContactVController = [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([UpdataContactVController class])];
    
    //将模型对象赋值给 跳转页面的属性
    [updataContactVController setPeople:people];
    
    //设置标题
    updataContactVController.navigationItem.title = @"更新联系人";
    
    //页面跳转
    [self.navigationController pushViewController:updataContactVController animated:YES];
    
}

如果按住该行,往左一划,会出现删除界面,如何完成删除呢


首先要设置这个tableView能够进行编辑

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

然后是删除的操作

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        
        //从上下文中获得该模型
        People * people = [self.fetchResultsController objectAtIndexPath:indexPath];
        
        //从上下文中删除该模型
        [self.mangaedOjectContext deleteObject:people];
        
        //上下文保存
        NSError * error;
        if (![self.mangaedOjectContext save:&error])
        {
            NSLog(@"%@",[error localizedDescription]);
        }
        
        //跳转至根视图
        [self.navigationController popViewControllerAnimated:YES];
        
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}

以下是联系人添加的页面

其中点击图片是可以变照片的,当然选择照片也是用了苹果自带的一个工具,叫做UIImagePikcerController

就是这个属性

@property (strong, nonatomic) UIImagePickerController * imagePickerController;

回调的方法呢:

#pragma mark - 实现 imagePickerControllerDelegate 方法
//回调图片选择取消
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    //返回原来的界面
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    
    //获取到编辑好的图片
    UIImage * image = info[UIImagePickerControllerEditedImage];
    
    //把获取的图片设置成用户的头像
    [self.titleImageButton setImage:image forState:UIControlStateNormal];
    
    //返回原来的view
    [self dismissViewControllerAnimated:YES completion:nil];
}


添加页面的其他代码:

//
//  AddContactVController.m
//  简易通讯录
//
//  Created by YueWen on 15/9/10.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import "AddContactVController.h"
#import <CoreData/CoreData.h>
#import "People.h"
#import "Pinyin.h"
@interface AddContactVController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

//姓名的nameText
@property (strong, nonatomic) IBOutlet UITextField *nameText;
//电话的teleText
@property (strong, nonatomic) IBOutlet UITextField *teleText;
//地址的addressText
@property (strong, nonatomic) IBOutlet UITextField *addressText;
//上下文对象
@property (strong, nonatomic) NSManagedObjectContext * mamagedObjectContext;
//图片选择器
@property (strong, nonatomic) UIImagePickerController * imagePickerController;
//显示头像的按钮
@property (strong, nonatomic) IBOutlet UIButton *titleImageButton;

@end

@implementation AddContactVController

#pragma mark - 点击图片按钮,换图片的 目标动作回调
- (IBAction)changeTitleImage:(UIButton *)sender
{
    [self presentViewController:self.imagePickerController animated:YES completion:nil];
}

#pragma mark - 右上角 Done 的 bar button item 动作回调
- (IBAction)doneAddContact:(UIBarButtonItem *)sender
{
    //获取一个实体托管对象 people
    People * people = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([People class]) inManagedObjectContext:self.mamagedObjectContext];
    
    //为托管对象设置属性
    people.name = self.nameText.text;
    people.tele = self.teleText.text;
    people.address = self.addressText.text;
    
    //设置图片属性
    UIImage * image = self.titleImageButton.imageView.image;
    people.image = UIImagePNGRepresentation(image);
    
    //设置首字母
    people.firstWord = [NSString stringWithFormat:@"%c",pinyinFirstLetter([people.name characterAtIndex:0]) - 32];
    
    //上下文对象保存
    NSError * error;
    if (![self.mamagedObjectContext save:&error])
    {
        NSLog(@"%@",[error localizedDescription]);
    }
    
    //跳到模态
    [self dismissViewControllerAnimated:YES completion:nil];
    
}

#pragma mark - 左上角 Cancle 的 bar button item 动作回调
- (IBAction)cancleAddContact:(UIBarButtonItem *)sender
{
    //跳出模态状态
    [self dismissViewControllerAnimated:YES completion:nil];
}



- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置title
    self.navigationItem.title = @"添加联系人";
    
    //获取应用的上下文
    self.mamagedObjectContext = [self applicationManagedObjectContext];
    
    //初始化imagePickerController并配置
    self.imagePickerController = [[UIImagePickerController alloc]init];
    
    //是否可以编辑
    self.imagePickerController.allowsEditing = YES;
    
    //注册回调
    self.imagePickerController.delegate = self;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - 获取本应用的上下文对象
-(NSManagedObjectContext *)applicationManagedObjectContext
{
    //获取应用的单例对象<pre name="code" class="objc">#pragma mark - view加载方法
- (void)viewDidLoad
{
UIApplication * application = [UIApplication sharedApplication]; id delegate = application.delegate; //返回应用的上下文对象 return [delegate managedObjectContext];}
 

******************************************补充(2015 10 03) ************************************

      上面的写法运行的时候会出现卡顿现象,是因为imagePickerView加载是需要很多时间的,所以会出现卡顿,如果想要避免这种情况,就要用到多线程了,当初写的时候不会有多线程,现在回来补上,详情请去后面的博客iOS学习-------多线程编程了解,这样就不回卡顿了

#pragma mark - view加载方法
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //初始化上下文对象
    self.managedObjectContext = [self applicationManagedObjectContext];
    
    //设置面板
    [self loadPeopleContext];
    
    //创建图片选择器,用子线程加载,不然会出现卡顿现象
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        //异步加载相册
        self.imagePickerController = [[UIImagePickerController alloc]init];
       
        //用主线程来修改属性
        dispatch_async(dispatch_get_main_queue(), ^{
            
            //可以编辑
            self.imagePickerController.allowsEditing = YES;
            
            //注册回调
            self.imagePickerController.delegate = self;
        });

    });
 
}

这个时候需要注意,就是说,当点进去修改界面的时候,imagePickerView还不一定能够加载好,所以跳入的时候需要一个判断,不然可能会崩溃

/**
 *  titleImageButton target action
 *
 *  @param sender 头像按钮
 */
- (IBAction)changeTitleImage:(UIButton *)sender
{
    //当图片选择器必须加载完毕后,才能跳
    if (self.imagePickerController != nil)
    {
        //跳至图片选择界面
        [self presentViewController:self.imagePickerController animated:YES completion:nil];
    }

}


******************************************补充(2015 10 03) ************************************


点击某行,可以对该行的信息进行修改,并保存

代码与添加很像,就不再做过多的解释了,直接贴代码吧,感觉一般写程序写注释的习惯也是帮了我不少的忙

//
//  AddContactVController.m
//  简易通讯录
//
//  Created by YueWen on 15/9/10.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import "AddContactVController.h"
#import <CoreData/CoreData.h>
#import "People.h"
#import "Pinyin.h"
@interface AddContactVController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

//姓名的nameText
@property (strong, nonatomic) IBOutlet UITextField *nameText;
//电话的teleText
@property (strong, nonatomic) IBOutlet UITextField *teleText;
//地址的addressText
@property (strong, nonatomic) IBOutlet UITextField *addressText;
//上下文对象
@property (strong, nonatomic) NSManagedObjectContext * mamagedObjectContext;
//图片选择器
@property (strong, nonatomic) UIImagePickerController * imagePickerController;
//显示头像的按钮
@property (strong, nonatomic) IBOutlet UIButton *titleImageButton;

@end

@implementation AddContactVController

#pragma mark - 点击图片按钮,换图片的 目标动作回调
- (IBAction)changeTitleImage:(UIButton *)sender
{
    [self presentViewController:self.imagePickerController animated:YES completion:nil];
}

#pragma mark - 右上角 Done 的 bar button item 动作回调
- (IBAction)doneAddContact:(UIBarButtonItem *)sender
{
    //获取一个实体托管对象 people
    People * people = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([People class]) inManagedObjectContext:self.mamagedObjectContext];
    
    //为托管对象设置属性
    people.name = self.nameText.text;
    people.tele = self.teleText.text;
    people.address = self.addressText.text;
    
    //设置图片属性
    UIImage * image = self.titleImageButton.imageView.image;
    people.image = UIImagePNGRepresentation(image);
    
    //设置首字母
    people.firstWord = [NSString stringWithFormat:@"%c",pinyinFirstLetter([people.name characterAtIndex:0]) - 32];
    
    //上下文对象保存
    NSError * error;
    if (![self.mamagedObjectContext save:&error])
    {
        NSLog(@"%@",[error localizedDescription]);
    }
    
    //跳到模态
    [self dismissViewControllerAnimated:YES completion:nil];
    
}

#pragma mark - 左上角 Cancle 的 bar button item 动作回调
- (IBAction)cancleAddContact:(UIBarButtonItem *)sender
{
    //跳出模态状态
    [self dismissViewControllerAnimated:YES completion:nil];
}



- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置title
    self.navigationItem.title = @"添加联系人";
    
    //获取应用的上下文
    self.mamagedObjectContext = [self applicationManagedObjectContext];
    
    //初始化imagePickerController并配置
    self.imagePickerController = [[UIImagePickerController alloc]init];
    
    //是否可以编辑
    self.imagePickerController.allowsEditing = YES;
    
    //注册回调
    self.imagePickerController.delegate = self;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - 获取本应用的上下文对象
-(NSManagedObjectContext *)applicationManagedObjectContext
{
    //获取应用的单例对象
    UIApplication * application = [UIApplication sharedApplication];
    id delegate = application.delegate;
    
    //返回应用的上下文对象
    return [delegate managedObjectContext];
}


#pragma mark - 实现 imagePickerControllerDelegate 方法
//回调图片选择取消
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    //返回原来的界面
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    
    //获取到编辑好的图片
    UIImage * image = info[UIImagePickerControllerEditedImage];
    
    //把获取的图片设置成用户的头像
    [self.titleImageButton setImage:image forState:UIControlStateNormal];
    
    //返回原来的view
    [self dismissViewControllerAnimated:YES completion:nil];
}


@end

重要的代码差不多也就是这些了,本人新手一枚,如果有什么错误,感谢能够指正,不要误解更多的人.

iphone 开发基础控件UITableView 及通讯录列表 iphone中的基础控件UITableView,适合初学者,主要学习UITableView的常用属性设置、自定义分区标题、cell显示定义、索引列显示、索引列点击事件等。 通讯录按照首字母分区显示,右边显示索引列(A、B、C、D……X、Y、Z),点击索引列中的字母,列表滚动到对应字母的分区,同时浮动显示首字母于屏幕中央;滚动通讯录时,当滚动停止时,根据屏幕顶部的分区索引,浮动显示该分区对应的首字母。 立即下载

相关推荐

ios开发之 通讯录

ios开发,通过按钮调用通讯录,获得通讯录中的联系人的手机号码

IOSXcode简易通讯录

本次课程设计的主要内容是利用所学知识设计并制作一个简单的“同学录。其相似于生活中的通讯录,通讯录一般指在日常生活中用笔记录,也在手机,电脑,电子字典等电子产品中拥有这个功能。通讯录作为通讯录地址的书本,当今的通讯录可以涵盖多项内容。本次的项目中是在IOS平台上用Xcode使用swift语言实现的一款具有简易功能的“同学录”,本次设计项目主要包括以下内容:UI界面设计、后台逻辑代码的实现、代码与界面的连接。“同学录”是手机端一款帮助对联系人信息进行全面整合的记录软件,可以节省许多时间,增加用户管理效率。“同学

weixin_45779768的博客 648

Xilinx SDK调试与FPGA硬件验证全流程解析

本文详细解析了从Vivado导出硬件到Xilinx SDK进行调试与FPGA硬件验证的全流程。重点阐述了正确导出包含bitstream的硬件平台、创建合适的SDK工程、配置Debug会话以编程FPGA,并介绍了串口验证、自定义IP测试以及使用ILA进行软硬件联合调试的高级技巧,帮助开发者高效完成FPGA系统的软硬件协同开发与问题排查。

weixin_28327051的博客 310

UITableView实现通讯录效果

UITableView实现通讯录效果。

飞在江湖的专栏 285

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

07 Zabbix 微信告警

Zabbix 微信告警 1.注册企业微信 企业微信注册地址:https://work.weixin.qq.com 2.进入企业微信后台管理 2.1 添加微信成员 2.2创建应用 2.3 获取四项数据 (1)AgentID (2) Secret (3) 企业ID (4)部门ID 3.Zabbix Server配置 3.1确认脚本目录 # grep alertscripts /etc/zabbix/zabbix_server....

Jian Sun_的博客 1297

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总...

iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录、微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等。今天将和大家一起学习如何使用系统应用、使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 目录 系统应用 在开...

weixin_30731287的博客 941

突破限制:巧用Azure OpenAI,畅玩Gemini模型

通过 Azure OpenAI 服务这一巧妙的途径,间接调用 Gemini 模型,打破网络限制的壁垒。本文将详细介绍这一方法,无论你是人工智能领域的新手,还是经验丰富的开发者,都能从中获取实用的技巧,轻松开启 Gemini 模型的探索之旅

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 180

iOS开发长文--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录、微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等。今天将和大家一起学习如何使用系统应用、使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center

探路者的专栏 2563

第42篇FEDGLOSS算法BEYOND LOCAL SHARPNESS:COMMUNICATION-EFFICIENT GLOBALSHARPNESS-AWARE MINIMIZATIONFOR

:用上一轮伪梯度最小化锐度,获取与全局损失最相关的几何信息,引导全局优化趋向更平坦的最小值。效果对比分析:FEDGLOss。

weixin_74009895的博客 526

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 639

ios-利用UITableView实现简单的通讯录(纯代码实现)

利用UIImageView实现简单的通讯录在实现此功能之前,先简单的了解UITableView的方法使用:发现有几个博客讲的很不错,贴出来推荐:https://blog.youkuaiyun.com/mhw19901119/article/details/8755029一、UITableView的基本使用方法:主要的核心实现由三个部分组成:(1)设置并返回此TableView是由多少个section组成的。(...

minld的博客 2791

【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?

IEEE 802.3标准发展历史简介

highman110的博客 5017

UITableView --- 通讯录demo1

准备工作: 创建一个工程 Model: 载有数据的 Person.plist 文件(里面包含了通讯录的所有内容,包括姓名 ,电话号码,头像等) Person 类 把装有 头像图片的文件夹 拖入到工程中 ---------------------------------------------------------------------------------------------

xintailirui的专栏 1433

动态视频目标追踪系统:基于YOLOv11+DeepSORT的从入门到实战全流程指南

仅保留车辆类别(假设车辆类别ID为2)if det.class_index == 2: # 车辆类别ID通过本指南,你已完成从环境搭建数据准备模型训练到追踪系统与UI界面的全流程,搭建了一套完整的动态视频目标追踪系统。该系统在安防监控、交通管理等场景中具有实用价值,可实现目标的实时稳定追踪。未来,你可尝试结合多模态特征(如目标外观+运动特征)提升追踪鲁棒性,或探索轻量化模型部署(如TensorRT加速),让系统在边缘设备上也能高效运行。

LXY_LOVE36的博客 142

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

CoreData 实例 --- 通讯录

要求:将数据存放于CoreData数据库中,包括联系人的姓名和电话号码,将数据取出,显示在view上 详细代码如下 首先导入#import ViewController.h 文件 static NSManagedObjectContext * _context;  //上下文 @interface TXLViewControlle

人生得意须尽欢,做一个快乐的程序猿~~~ 1122

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

UITableView 编辑(一个实现了添加 删除功能的iOS通讯录)

一个实现了添加 删除功能的iOS通讯录: AppDelegate.m : (引入RootViewController.h文件) //创建根视图控制器    RootViewController *rootVC = [[RootViewController alloc]init];     UINavigationController *navVC = [[UINaviga

su81920的博客 551

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

通讯录 CoreData & tabelView

数据持久化的增删改查 通过 FRC 和 CoreData 动态刷新tabelView 数据 #import "ViewController.h" #import "Person.h" @interface ViewController ()UISearchResultsUpdating,UISearchControllerDelegate,NSFetchedResult

better_dong的博客 505

[iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

A.需求 1.搭建一个“私人通讯录”Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改) 这个代码托管了在github: https://github.com/hellovoidworld/ContactBook (本来网速不好,打算用国内的csdn甚至京东,发现github有现成的app,不用...

daxiguan0304的博客 1530

ios通讯录的建立

很多时候我们会用到诸如通讯录,联系人等的建立,通过字母就能够查找到,今天我就来给大家简单的分享下: 通讯录界面如下所示: 当然首先得导入plist文件 1.建一个类RootTableViewController(当然这个类名可以随便取,继承与UITableViewController,在AppDelegate.h中导入 RootTableV...

weixin_30684743的博客 94

9.使用UITableView来制作一个简易的联系人存储列表

使用UITableView来制作一个简易的联系人存储列表

Cain For iOS的专栏 616

iOS日历组件、微信聊天框架、电话通讯录、遮罩引导等源码

iOS精选源码 日志实时显示以及快速修改沙盒值方便测试,支持摇一摇 奇趣魔法电话 多样化的UICollectionView,轻松实现各种复杂布局 pop弹出框视图 iOS 封装原生二维码扫描和生成 一款漂亮,强大的 iOS 日历组件 一句话实现App遮罩引导操作提示 iOS CoreData (二) 版本升级和数据库迁移 ...

sunnyaigd830的博客 334

IOS5基础之十二-----分组分区和索引分区

这个分区很想我们手机上通讯录的样式。所以说用处还是很大的哦~~~~~ 最近在家待了几天感觉好像还有点感冒了,哈哈,所以,还是要出去走走,不要当宅男哦,还是很容易生病的哦~~~~~~ 其实这个还是比较简单的,我就直接放代码了,前面直接就是托控件,关联一个委托和数据源。 头文件代码 #import @interface BIDViewController : UIVi

期盼的骆驼专栏 1206

IOS 分享 牛人 Demo

iphone开发十几个实用demo合集    2012(秋季)CocoaChina开发者大会专题回顾 公司接了个培训项目,给一个外包公司培训一批应届生,我从课程一半开始接手,讲了一个多月,内容包括UITableView,UIScrollView,AssetsLibrary,MapKit,AddressBook,AVFoundation,MediaPlayer,Coredata,Sqlite

风---的专栏 2万+

通讯录的实现

一.搭建界面 二,登录界面 - (void)setupUI { // 为 textField 添加 监听事件 // 当我们需要监听textField文本改变的时候, 需要添加 监听事件: UIControlEventEditingChanged [_userNameField addTarget:self ac

n18356989592qq的博客 381
上一篇: iOS开发-------手写一个数据持久化(Coredata)的类
下一篇: iOS开发-------简单通讯录2(UISearchController)
RITL
博客等级 码龄11年 69粉丝 77原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值