【问题标题】:Adding call back from addTarget action function in Obj-C从 Obj-C 中的 addTarget 操作函数添加回调
【发布时间】:2017-09-17 11:15:01
【问题描述】:

我已经为 UITableView 类编写了类别。在那,我添加了添加刷新控制器的方法。

我希望我的刷新控制器目标方法给主函数一个回调。

我的 tableView 类别.h

#import <UIKit/UIKit.h>

typedef void (^UITableViewRefreshControllerCompletion) (UITableView *tableView);

@interface UITableView (UITableView)

-(void)addRefreshController:(UITableViewRefreshControllerCompletion)completionblock;
-(void)removeRefreshController;

@end

我的 tableView 类别 .m :

#import "UITableView+UITableView.h"

@implementation UITableView (UITableView)

-(void)addRefreshController:(UITableViewRefreshControllerCompletion)completionblock {

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc]init];
    [refreshControl setTintColor:[UIColor appthemeblueColor]];
    [self setRefreshControl:refreshControl];

    [refreshControl addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];

}

-(void) refreshTableView:(UIRefreshControl* )refreshControl {

     completionblock(self); // I want this to call when this method is getting called
}



-(void)removeRefreshController {

    if([self.refreshControl isRefreshing])
        [self.refreshControl endRefreshing];
}

我正在调用 ViewController 中的刷新控制器:

 [self.profileDetailsrTableView addRefreshController:^(UITableView *tableView){

        [self profileDetailsAPICall];
    }];

【问题讨论】:

  • Categories 无法添加存储属性,因此您无法存储块以便以后调用它。
  • 我对你在问什么有点困惑。如果您希望能够从refreshTableView 内部调用completionBlock,则需要存储对回调的引用。您不能在类别中执行此操作,因为类别不能包含实例变量。
  • 我可以在刷新控件对象中存储completionBlock吗?
  • 你可以继承UITableView来实现这个。
  • 相反,如果我创建 refreshcontrol 的子类并将完成块存储在其中?

标签: ios objective-c uitableview callback uirefreshcontrol


【解决方案1】:

我通过获取 UIRefreshControl 的子类并存储完成块解决了这个问题;

子类-

#import <UIKit/UIKit.h>

typedef void (^UITableViewRefreshControllerCompletion) (UITableView *tableView);

@interface UIRefreshControlSubClass : UIRefreshControl

@property(strong, nonatomic) UITableViewRefreshControllerCompletion completionBlock;

@end

所以调用变成了:

-(void)addRefreshController:(UITableViewRefreshControllerCompletion)completionblock {

    UIRefreshControlSubClass *refreshControl = [[UIRefreshControlSubClass alloc]init];
    [refreshControl setTintColor:[UIColor appthemeblueColor]];
    [self setRefreshControl:refreshControl];
    refreshControl.completionBlock = completionblock;

    [refreshControl addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];

}

-(void) refreshTableView:(UIRefreshControlSubClass* )refreshControl {

     refreshControl.completionBlock(self);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多