IOS菜鳥的所感所思——UITableView中資料之間的順序與反向傳遞
這是我的第一篇關於IOS的文章,可能有些不對的地方,希望大家指正。
步驟:
一:
1.建立一個專案,其ViewController的型別是UITableViewController,設定其identifier——MyTextCell;(點選viewcontroller的控制器後 點選上面的標題欄Editor中的embed in中的Navigation)
2.新增一個新的controller,MyPicturesViewController繼承UITableViewController,設定其identifier——MyPicCell;
3.建立segue,從ViewController的控制器按住ctrl新增segue到MyPicturesViewController,選擇show,其segue的identifier是ShowPic
初步的view檢視工作完成了。
第二部分就是程式碼的,
二:
1.為ViewController新增資料來源,建立newGroup——ModelClass,在ModelClass中建立cocoa Touch class的NSObject類ViewControllerInfo。
2.在ViewControllerInfo中初始化一些資訊
ViewControllerInfo.h檔案中:
#import<Foundation/Foundation.h>
@interface ViewControllerInfo :NSObject
@property (nonatomic,strong)NSArray
*cellInfo;
@end
ViewControllerInfo.m檔案中:#import "ViewControllerInfo.h"
@implementation ViewControllerInfo
- (id)init{
if (self = [superinit]) {
[selfinitCellInfo];
}
return self;
}
- (void)initCellInfo{
_cellInfo = [[NSArrayalloc]initWithObjects:@"內容一",@"內容二",@"內容三",nil];
}
@end
ViewController.m檔案中:
3.給ViewController中的Cell初始化內容。
#import "ViewController.h"
#import "ViewControllerInfo.h"
#import "MyPicturesViewController.h"
@interfaceViewController ()
@property (nonatomic,strong)ViewControllerInfo *viewInfo;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
[selfconfigureViewInfo];
}
//載入資料。
- (void)configureViewInfo{
_viewInfo = [[ViewControllerInfoalloc]init];
}
//行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
returnself.viewInfo.cellInfo.count;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
staticNSString *viewControllerCellIdentifier =@"MyTextCell";
UITableViewCell *viewCell = [tableViewdequeueReusableCellWithIdentifier:viewControllerCellIdentifier];
if (viewCell ==nil) {
viewCell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:viewControllerCellIdentifier];
}
viewCell.textLabel.text =self.viewInfo.cellInfo[indexPath.row];
return viewCell;
}
這樣在viewController中cell就有值了。
4.將cell中的內容作為MyPicturesViewController的題目(資料的順序傳值)。
/**
* 該方法是將點選的cell中的值傳入到sender中,並指定其segue的identifier
*
* @param tableView <#tableView description#>
* @param indexPath <#indexPath description#>
*/
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *needTransInfo =self.viewInfo.cellInfo[indexPath.row];
[selfperformSegueWithIdentifier:@"ShowPic"sender:needTransInfo];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifierisEqualToString:@"ShowPic"] && [segue.destinationViewControllerisKindOfClass:[MyPicturesViewControllerclass]]) {
MyPicturesViewController *myPicViewController = segue.destinationViewController;
//將sender中的值傳到myPicViewController物件中myTitle變數中。
myPicViewController.myTitle = sender;
}
}
(需要在MyPicViewController.h中定義NSString的沒有 myTitle)
@property (nonatomic,strong)NSString *myTitle;
5.初始化MyPicViewController中資訊,在modelClass中新增一個類PicInfo.先新增一些資料。(當然在.h檔案中有一個NSArray的變數cellInfo) PicInfo.m檔案中:
#import "PicInfo.h"
@implementation PicInfo
- (id) init{
if (self = [superinit]) {
[selfinitPicCellInfo];
}
returnself;
}
- (void) initPicCellInfo{
_cellInfo = [[NSArrayalloc]initWithObjects:@"image1.jpg",@"image2.jpg",@"image3.jpg",nil];
}
@end
需要匯入三張圖片:
6.初始化MyPicViewController
MyPicViewController.m檔案中:
#import "MyPicturesViewController.h"
#import "PicInfo.h"
@interfaceMyPicturesViewController ()
@property (nonatomic,strong)PicInfo *picInfo;
@end
@implementation MyPicturesViewController
- (void)viewDidLoad {
[superviewDidLoad];
[selfconfigureData];
[selfsetTitle:self.myTitle];
}
- (void)configureData{
_picInfo = [[PicInfoalloc]init];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
returnself.picInfo.cellInfo.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
staticNSString *cellInfoIdentifier =@"MyPicCell";
UITableViewCell *viewCell = [tableViewdequeueReusableCellWithIdentifier:cellInfoIdentifier];
if (viewCell ==nil) {
viewCell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:cellInfoIdentifier];
}
UIImage *cellImage = [UIImageimageNamed:self.picInfo.cellInfo[indexPath.row]];
viewCell.imageView.image = cellImage;
return viewCell;
}
這樣MyPicViewController中的cell就有圖片了
7.將MyPicViewController中的圖片傳到ViewController中的cell中(反向傳遞資料)將會用到協議delegate,在MyPicViewController.h定義協議,實現協議中的方法。
#import <UIKit/UIKit.h>
@classMyPicturesViewController;
@protocol transmitPicDelegate <NSObject>
//定義協議需要實現的方法,也就是需要在一個controller中將圖片傳到另一個controller中
- (void)choicePic:(MyPicturesViewController *)controller didChoicePic:(NSString *)PicName;
@end
@interface MyPicturesViewController :UITableViewController
@property (nonatomic,strong)NSString *myTitle;
@property (nonatomic,strong)id <transmitPicDelegate> delegate;
@end
接著在MyPicViewController.m檔案中,當點選一行cell時,
/**
* 將在MyPicturesViewController中cell的對應的圖片的name獲得到
*
* @param tableView <#tableView description#>
* @param indexPath <#indexPath description#>
*/
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *imageName =self.picInfo.cellInfo[indexPath.row];
UITableViewCell *newCell = [tableViewcellForRowAtIndexPath:indexPath];
if(newCell.accessoryType ==UITableViewCellAccessoryNone)
{
newCell.accessoryType =UITableViewCellAccessoryCheckmark;
newCell.textLabel.textColor = [UIColorblueColor];
} else{
newCell.accessoryType =UITableViewCellAccessoryNone;
}
// NSLog(@"%@",imageName);
//呼叫協議中的方法傳入實參
[self.delegatechoicePic:selfdidChoicePic:imageName];
}
8.在ViewController.h匯入MyPicViewController.h之後,遵守該協議
#import <UIKit/UIKit.h>
#import "MyPicturesViewController.h"
@interface ViewController :UITableViewController<transmitPicDelegate>
@end
在ViewController.m中具體實現協議中的方法。
- (void)choicePic:(MyPicturesViewController *)controller didChoicePic:(NSString *)PicName{
self.imageName = PicName;
// NSLog(@"%@",self.imageName);
[self.tableViewreloadData];
}
當然在這個檔案中需要定義imageName的變數,而reloadData是將這個檢視的資料重新載入一遍。
@interfaceViewController ()
@property (nonatomic,strong)ViewControllerInfo *viewInfo;
@property (nonatomic,strong)NSString *imageName;
@end
那麼需要把myPicViewController設定成自己的代理。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifierisEqualToString:@"ShowPic"] && [segue.destinationViewControllerisKindOfClass:[MyPicturesViewControllerclass]]) {
MyPicturesViewController *myPicViewController = segue.destinationViewController;
myPicViewController.delegate = self;
myPicViewController.myTitle = sender;
}
}
同時需要在方法中將獲取的圖片name設定成此controller的cell中的UIImageView.image;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *viewControllerCellIdentifier =@"MyTextCell";
UITableViewCell *viewCell = [tableView dequeueReusableCellWithIdentifier:viewControllerCellIdentifier];
if (viewCell == nil) {
viewCell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:viewControllerCellIdentifier];
}
viewCell.textLabel.text =self.viewInfo.cellInfo[indexPath.row];
viewCell.imageView.image = [UIImage imageNamed:self.imageName];
return viewCell;
}
執行之後,點選內容一
若想只是把點選所對應的那行新增圖片,這樣的話應該怎樣弄呢?
只需在ViewController中定義一個NSInteger的變數indexNumber紀錄當點選一行的行數,
@property (nonatomic)NSInteger indexNumber;
然後在,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
self.indexNumber = indexPath.row;
NSString *needTransInfo = self.viewInfo.cellInfo[indexPath.row];
[selfperformSegueWithIdentifier:@"ShowPic"sender:needTransInfo];
}
再在,(紅色的部分)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *viewControllerCellIdentifier =@"MyTextCell";
UITableViewCell *viewCell = [tableViewdequeueReusableCellWithIdentifier:viewControllerCellIdentifier];
if (viewCell == nil) {
viewCell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:viewControllerCellIdentifier];
}
viewCell.textLabel.text =self.viewInfo.cellInfo[indexPath.row];
if (self.indexNumber == indexPath.row) {
viewCell.imageView.image = [UIImage imageNamed:self.imageName];
}
return viewCell;
}
從而執行:
實現了資料的順序和反向傳遞。
該專案的完整程式碼:點選開啟連結