2014-02-19 45 views
0

Hye everyone !!我有一個問題,我不知道我能做什麼! 我的目標是在其他ViewController中傳遞一個TableviewController的變量,當我在自定義單元中的buttom中調用。我使用自定義單元格,並在customcell中有2個標籤,一個按鈕。 這是我的代碼:自定義單元中的按鈕傳輸變量iphone

ArticlesCell.h

#import <UIKit/UIKit.h> 
#import "CalculerViewController.h" 
@interface ArticlesCell : UITableViewCell 
@property (strong, nonatomic) IBOutlet UILabel *lblproduit; 
@property (strong, nonatomic) IBOutlet UILabel *lblargent; 
- (IBAction)btnincrement:(id)sender; 
@property (strong, nonatomic) IBOutlet UIButton *btn; 
@property (strong, nonatomic) NSString *recupererlblproduit; 
@end 

的一個tableviewcontroller:

ArticlesTableViewController.m

#import "ArticlesTableViewController.h" 
#import "ArticlesCell.h" 


@interface ArticlesTableViewController() 

@end 

@implementation ArticlesTableViewController 
@synthesize arrayargent1,arrayproduit1,arrayargent2,arrayproduit2,recuperationproduit; 
- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
    // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    recuperationproduit=nil; 
    arrayproduit1 = [[NSMutableArray alloc] initWithObjects:@"Câble Ethernet UTP-CAT5 ",@"Câble Ethernet UTP-CAT6 ",@"Carte Réseau",@"Hub",@"Switch",@"Routeur",nil]; 
    arrayargent1 = [[NSMutableArray alloc] initWithObjects:@"10 000",@"15 000 ",@"250 000",@"300 000",@"500 000",@"550 000",nil]; 
    arrayproduit2 = [[NSMutableArray alloc] initWithObjects:@"Ram ",@"Disque Dur",@"Câble d'Alimentation",@"Carte Mere",@"Processeur",nil]; 
    arrayargent2 = [[NSMutableArray alloc] initWithObjects:@"100",@"15 000 ",@"250 000",@"300 000",@"500 000",@"550 000",nil]; 



} 

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

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    return 2; 
} 

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

if (section == 0) 
    return self.arrayproduit1.count; 
if (section == 1) 
    return self.arrayproduit2.count; 
return 0; 
} 


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    if (section == 0) 
    return @"Matériels Réseaux"; 
    if (section == 1) 
    return @"Matériels Ordinateur"; 
    return @"undefined"; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"seguecalcule"]) 
    { 
    UINavigationController *navigationController = segue.destinationViewController; 
    CalculerViewController *calculerViewController = [[navigationController viewControllers] objectAtIndex:0]; 
      calculerViewController.introlblproduit=recuperationproduit; 
      calculerViewController.delegate = self; 

    } 


} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"CellArticle"; 



ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 


if (indexPath.section == 0){ 
    cell.lblproduit.text = [arrayproduit1 objectAtIndex:indexPath.row]; 
    cell.lblargent.text = [self.arrayargent1 objectAtIndex:indexPath.row]; 

} 
else if (indexPath.section == 1){ 
    cell.lblproduit.text = [self.arrayproduit2 objectAtIndex:indexPath.row]; 
    cell.lblargent.text = [self.arrayargent2 objectAtIndex:indexPath.row]; 

} 

return cell; 
} 

- (void)calculerViewControllerDidCancel:(CalculerViewController *)cancel 
{ 
[self dismissViewControllerAnimated:YES completion:nil]; 
} 



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


} 

@end 

CalculerViewController.m

#import "CalculerViewController.h" 
@interface CalculerViewController() 

@end 

@implementation CalculerViewController 
@synthesize display,lbltitre,delegate,introlblproduit; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    lbltitre.text=introlblproduit; 


} 

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

- (IBAction)valider:(id)sender { 
} 

- (IBAction)cancel:(id)sender { 

[self.delegate calculerViewControllerDidCancel:self]; 
} 
@end 

我想在自定義單元格中輸入自定義單元格的標籤。 請幫助我!

+0

您只需將自定義單元的標籤值發送給其他viewcontroller。那是對的嗎? – GenieWanted

+0

是的,當我點擊同一個單元格中的按鈕!謝謝你的評論!!解決這個問題對我來說非常重要! – user192417

回答

0

最簡單的解決辦法是在每個單元直接連接的按鈕相同的方法在您的視圖控制器,然後使用發送者參數來訪問抽頭細胞。

像這樣(未測試):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"CellArticle"; 

    ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // When the user taps the cell button, fire a method on the view controller 
    [cell.btn addTarget:self action:@selector(cellButtonTapped:) forControlEvents:UIControlEventsTouchUpInside]; 

    ... 
} 

- (void) cellTapped:(id)sender 
{ 
    ArticleCell *cell = sender.parent; // XXX: This is where it gets ugly! 
    // Now send your cell content to your other view controller. 
} 

但你可以看到這種方法獲取,你必須瞭解細胞內的視圖層次真難看

所以,一個更好的方法是使用代理模式:有子類的UITableViewCell有一個連接到您的UIViewController實例的委託。

在你的情況下,它會是這個樣子:

// Forward declaration required because protocol references class 
@protocol ArticlesCellDelegate; 

@interface ArticlesCell : UITableViewCell 
@property (strong, nonatomic) IBOutlet UILabel *lblproduit; 
@property (strong, nonatomic) IBOutlet UILabel *lblargent; 
- (IBAction)btnincrement:(id)sender; 
@property (strong, nonatomic) IBOutlet UIButton *btn; 
@property (strong, nonatomic) NSString *recupererlblproduit; 

// New delegate property 
@property (strong, nonatomic) id<ArticleCellDelegate> delegate; 

@end 

@protocol ArticlesCellDelegate 
    - (void) didTapButtonInArticleCell:(ArticleCell*)cell; 
@end 

然後在您的視圖控制器:

@interface ArticlesTableViewController() <ArticleCellDelegate> 

@end 

@implementation ArticlesTableViewController 

... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"CellArticle"; 

    ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Make the view controller the cell's delegate 
    cell.delegate = self; 
    ... 
} 

- (void) didTapButtonInArticleCell:(ArticleCell*)cell { 

    // Now send your cell content to your other view controller. 
} 

你需要的另一件事是在你的文章細胞類,你需要在點擊按鈕時處理委託。您btnIncrement:方法可以做到這一點:

@implementation ArticleCell 

... 
- (IBAction)btnincrement:(id)sender; 
{ 
    if(self.delegate) 
     [self.delegate didTapButtonInArticleCell:self]; 
} 

作爲一個方面說明,如果我是你,我會移動儘可能多的那些UI元素在該接口上定義的,因爲我可以。接口部分正是它所說的:一個定義接口的地方。您通常希望在實現部分中封裝視圖的內部工作,並使接口部分反映您希望使用的方式。

+0

好的,謝謝!我嘗試用你的答案來解決我的問題,如果我阻止,我會在這裏發佈!!非常感謝! – user192417

+0

不客氣。請注意,我沒有測試代碼,所以可能會有一些小小的麻煩。該方法是正確的,但。 – smee

+0

它完美的作品!非常感謝你!你已經解決了我的問題!我很高興繼續我的項目!謝謝!! :D。我已經使用你的第二個解決方案(代表) – user192417

0

我懷疑你prepareForSegue方法您的導航控制器的孩子視圖控制器尚未創建,並深入到導航控制器,並試圖操縱它的根視圖控制器是壞的設計呢。

我建議讓你的導航控制器成爲UINavigationController的自定義子類。給它的屬性來保存你的價值觀,並在你的prepareForSegue中設置它們。

然後在你的CalculerViewController的viewDidLoad,獲取您的導航控制器,它投射到您的自定義類,並從導航控制器讀取數據。

+0

感謝您的回答!我不明白,我是新的Objective-C和iPhone!你能舉一個例子嗎! – user192417

+0

我沒有一個例子,這是你的應用程序所特有的。我不會爲你寫你的代碼。你不瞭解哪些部分?閱讀那部分/那些部分。實驗。如果您遇到問題,請發表更多問題。 –

+0

我可以調用一個變量,如果我在導航控制器中使用buttom,我已經閱讀了很多教程來做到這一點,但我的項目是自定義單元中的按鈕!當我點擊同一個單元格上的buttom時,如何轉移標籤 – user192417