1. 程式人生 > >IOS菜鳥的所感所思——UITableView中資料之間的順序與反向傳遞

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中,並指定其segueidentifier

 *

 *  @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的變數cellInfoPicInfo.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時,

/**

 *  將在MyPicturesViewControllercell的對應的圖片的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;

}

從而執行:



實現了資料的順序和反向傳遞。

該專案的完整程式碼:點選開啟連結