从其他类调用方法时iOS代码未运行
Posted
技术标签:
【中文标题】从其他类调用方法时iOS代码未运行【英文标题】:iOS Code Not Running When Method Called From Other Class 【发布时间】:2018-02-22 00:20:09 【问题描述】:我有一个自定义 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 部分,所以我知道它正在推送的视图控制器很好,我就是不知道这里发生了什么。
更新:
我有一些工作,强调有点。
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,其他行将运行代码,但它只对第一行的数据执行。
【问题讨论】:
Edititem 是在 uitableviewcell 类还是 tableviewcontroller 类中? 新创建的TheItemsList
实例没有导航控制器。您的单元格不应推送视图控制器。它应该可以在您的表视图控制器上使用一个委托方法,该方法可以推送一个新的视图控制器
@Paulw11 好的,那么我将如何去做,以便在按下编辑按钮时它可以推动视图控制器? IBAction editItem 在单元格上,(void)editItem 在 tableviewcontroller 上
正如我所说,在您的单元格和视图控制器之间使用委托模式。
@Paulw11 检查 OP 更新以了解它是如何部分工作的,但不确定我做错了什么
【参考方案1】:
您应该使用 UITableViewCell 中的委托模式将按钮按下委托回 UIViewController,其中包含使用单元格的 UITableView。
然后在 cellForRowAt:IndexPath 中检索单元格并将其委托设置为 cell.delegate = self
。在视图控制器中,您实现委托并处理操作。
在单元格中设置一个委托变量(var delegate: MyCellDelegate?)并在 editItem 函数中调用该委托,例如 self.delegate?.editItem()
【讨论】:
我以前从未在这里做过委托模式,所以大部分都超出了我的想象,我仍在使用 Obj-C 您基本上创建了一个包含一个功能的协议。这就像java中的接口。代表无处不在,是 Obj-C 和 Swift 语言概念的重要组成部分。你肯定见过一些(例如 UITableViewDelegate)developer.apple.com/library/content/documentation/General/… 正在处理但遇到问题,请参阅 OP 进行更新。 我有部分工作,但有一些问题。 你没发现问题吗?我看到您正在设置委托,然后检查单元格是否为零,如果是,则在出列队列中注册一个新单元格。这当然行不通。首先,您应该提前注册单元格,例如在 viewDidLoad 中并将 cell.delegate = self 一直放在 cellForRowAt 的底部,这样您就可以 100% 确定有一个单元格【参考方案2】:你的问题基本上是因为这条线
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
单击单元格上的按钮时,它不一定选择行。按钮进行触摸。解决此问题的一种方法是找到按钮所在单元格的 NSIndexPath ,然后对其进行操作。一种方法是使用 editAction
委托提供的单元格引用
-(void)editTheItem:(ItemCell *)theCell
将[self.tableView indexPathForSelectedRow]
替换为[self.tableView indexPathForCell:theCell]
【讨论】:
以上是关于从其他类调用方法时iOS代码未运行的主要内容,如果未能解决你的问题,请参考以下文章
IOS/XCODE:在其他类中调用 NSFetchedResultsController 方法