从其他类调用方法时,iOS代码未运行

时间:2018-02-22 00:20:10

标签: ios uitableview uibutton delegates

我有一个自定义的UITableViewCell xib,上面有两个按钮。一个编辑按钮,旨在将该单元格的信息传递给新的视图控制器,这是我目前遇到的问题。我在自定义单元格中为TableViewController创建了一个属性,并将按钮连接到此代码:

-(IBAction) editItem {
    self.itemsList = [[TheItemsList alloc] init];
    [self.itemsList editItem];
    NSLog(@"EDIT");
}

在TheItemsList中我有这段代码:

-(void)editItem {
    NSLog(@"EDITAGAIN");
    EditItem *detailViewController = [[EditItem alloc] initWithNibName:@"EditItem" bundle:nil];
    detailViewController.selectedCountry = self.selectedCountry;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    detailViewController.therow = indexPath.row;
    //Pass the selected object to the new view controller.

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
}

控制台为每个方法打印我的NSLog,但视图不推送。此代码以前在表视图的didSelectForIndexPath部分中使用,所以我知道它正在推动的视图控制器很好,我只是无法弄清楚这里发生了什么。

更新:

我有SOMEWHAT工作,有点强调。

ItemCell.h

#import <UIKit/UIKit.h>
#import "TheItemsList.h"
@class TheItemsList;
@class ItemCell;
@protocol ItemCellDelegate <NSObject>
@required
-(void)editTheItem:(ItemCell *)theCell;
@end

@interface ItemCell : UITableViewCell
@property (assign) id <ItemCellDelegate> delegate;

@property (nonatomic, retain) IBOutlet UILabel *itemName;
@property (nonatomic, retain) IBOutlet UILabel *itemPrice;
@property (nonatomic, retain) IBOutlet UILabel *itemAisle;
@property (nonatomic, retain) IBOutlet UIImageView *thumbnail;
@property (nonatomic, retain) TheItemsList *itemsList;



@end

的.m

#import "ItemCell.h"
#import "EditItem.h"
@implementation ItemCell
@synthesize itemName = _itemName;
@synthesize itemAisle = _itemAisle;
@synthesize itemPrice = _itemPrice;
@synthesize thumbnail = _thumbnail;
@synthesize itemsList, delegate;
- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}
-(IBAction) editItem {
    [self.delegate editTheItem:self];
}


@end

现在,在TableView

·H

#import <UIKit/UIKit.h>
#import "ItemCell.h"
@class ItemCell;
@protocol ItemCellDelegate;
@interface TheItemsList : UITableViewController <ItemCellDelegate>

的.m

-(void)editTheItem:(ItemCell *)theCell {
    NSLog(@"EDITAGAIN");
    EditItem *detailViewController = [[EditItem alloc] initWithNibName:@"EditItem" bundle:nil];
    detailViewController.selectedCountry = self.selectedCountry;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    detailViewController.therow = indexPath.row;
    //Pass the selected object to the new view controller.

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
}

我遇到的是两个问题。

1,当按下按钮时,tableview中的第一项不会执行任何操作。

2,其他行将运行代码,但它只对第一行的数据执行。

2 个答案:

答案 0 :(得分:1)

您应该使用UITableViewCell中的委托模式将按钮委托回UIViewController,其中包含使用单元格的UITableView。

在cellForRowAt:IndexPath中,然后检索单元格并将其委托设置为cell.delegate = self。在视图控制器中,您实现委托并处理操作。

在单元格中,您设置了一个委托变量(var delegate:MyCellDelegate?),并在editItem函数内部调用委托,如self.delegate?.editItem()

答案 1 :(得分:1)

您的问题基本上是因为这一行

 NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

单击单元格上的按钮时,它不会选择该行。按钮触摸。解决此问题的方法是找到按钮所在的单元格的NSIndexPath,然后使用它进行操作。一种方法是使用从editAction委托

提供的单元格引用
-(void)editTheItem:(ItemCell *)theCell

[self.tableView indexPathForSelectedRow]替换为[self.tableView indexPathForCell:theCell]