gpt4 book ai didi

ios - 在 superView 上执行选择器

转载 作者:行者123 更新时间:2023-11-28 18:56:29 29 4
gpt4 key购买 nike

我有一个 UICollectionView,它使用 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 来确定用户何时滚动到底部。

我的 UICollectionView 的所有者有一个向服务器发送命令并请求更多数据的方法。

我想做的是从我的 UICollectionView,特别是从 scrollViewDidScroll 中对所有者(我的 View Controller )执行选择器。

我尝试使用以下代码来实现:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat contentHeight = scrollView.contentSize.height;
if (offsetY > contentHeight - scrollView.frame.size.height)
{
[[self superView] performSelector:@selector(onScrolledToBottom) withObject:nil];
}
}

注意:选择器 onScrolledToBottom 是我的 UICollectionViewSEL 属性。

我得到的错误说:

-[UIView onScrolledToBottom]: unrecognized selector sent to instance 0x7fc641e76e00
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView onScrolledToBottom]: unrecognized selector sent to instance 0x7fc641e76e00'

编辑

我已经精简了我的代码来解决这个问题。

我的 ViewController.m 中有以下内容

....

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initCollectionView];
}
....

- (void) getMoreInfo{
NSLog(@"Getting more info");
}

- (void) initCollectionView{
UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
flowLayout.itemSize = CGSizeMake(50.0, 60.0);
flowLayout.sectionInset = UIEdgeInsetsMake(20, 0, 20, 0);
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
flowLayout.headerReferenceSize = CGSizeMake(320.f, 30.f);

myCollectionView *mVC = [myCollectionView alloc] init: self.view: flowLayout: @selector(getMoreInfo)];
}

对于我的 myCollectionView.h.m 文件如下所示:

#import <UIKit/UIKit.h>

@interface myCollectionView : UICollectionView<UIScrollViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource>{
UIView *parentView;
SEL onScrolledToBottom;
}

@property UIView *parentView;
@property SEL onScrolledToBottom;

- (id)init: (UIView*) parent: (UICollectionViewLayout *)layout: (SEL)onScrolledToBottomSEL;
@end

#import "myCollectionView.h"

@implementation myCollectionView

@synthesize parentView = parentView;
@synthesize onScrolledToBottom = onScrollToBotton;

- (id)init: (UIView*) parent: (UICollectionViewLayout *)layout: (SEL)onScrolledToBottomSEL{
self = [super initWithFrame: CGRectMake(0.0f, 0.0f, parent.frame.size.width, parent.frame.size.height) collectionViewLayout: layout];
if (self) {
parentView = parent;
self.delegate = self;
self.dataSource = self;
onScrolledToBottom = onScrolledToBottomSEL;
}

return self;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat contentHeight = scrollView.contentSize.height;
if (offsetY > contentHeight - scrollView.frame.size.height)
{
[parentView performSelector:@selector(onScrolledToBottom) withObject:nil];
}
}

最佳答案

您获得的是父 View 而不是父 Controller ,仅此而已。其次,你不应该尝试这样做。而是使用协议(protocol)并将您的 Controller 作为委托(delegate)传递给您的自定义 Collection View 。

@protocol MyCollectionViewScrollProtocol <NSObject>

- (void)scrolledToBottom;

@end

然后在您的 ViewController 中实现此协议(protocol)并在您的 CollectionView 中

像这样创建一个弱属性委托(delegate):

@property(weak, nonatomic) id<MyCollectionViewScrollProtocol> delegate;

然后就可以调用了

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat contentHeight = scrollView.contentSize.height;
if (offsetY > contentHeight - scrollView.frame.size.height)
{
[self.delegate scrolledToBottom];
}
}

并且不要忘记从 Controller 设置委托(delegate)属性。


由 OP 编辑​​:

Controller 应在.h文件中包含以下代码:

#import <UIKit/UIKit.h>

@protocol ViewControllerProtocol <NSObject>
- (void) Pong;
@end

@interface ViewController : UIViewController <ViewControllerProtocol>

@end

以及 .m 文件中某处的以下代码:

#import "ViewController.h"
@import UIKit;
#import "myUnit.h"

@interface ViewController ()
@end

@implementation ViewController


- (void)viewDidLoad {
[super viewDidLoad];
myUnit mU = [[myUnit alloc] init];
mU.linkToController = self;
[mU Ping];
}

......

- (void) Pong{
NSLog(@"Pong");
}

......

想要访问 Controller 的单元需要在.h文件中有如下代码:

#import <Foundation/Foundation.h>
#import "ViewController.h"

@interface myUnit : NSObject {
}

@property (weak, nonatomic) id <ViewControllerProtocol> linkToController;

- (void)Ping;

@end

而想要访问 Controller 的单元需要在.m文件中有如下代码:

#import "myUnit.h"
#import "ViewController.h"


@implementation myUnit

- (void) Ping {
NSLog(@"Ping");
[self.linkToController Pong];
}


@end

关于ios - 在 superView 上执行选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053622/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com