从其他类调用方法时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代码未运行的主要内容,如果未能解决你的问题,请参考以下文章

从Python中其他进程中运行的函数调用类方法

覆盖未调用的虚拟方法

IOS/XCODE:在其他类中调用 NSFetchedResultsController 方法

—— iOS 运行时中方法的调用流程

在 iOS 8 中重新加载时未调用 UICollectionview cellForItemAtIndexPath

从 Swift 中的其他类调用方法