gpt4 book ai didi

ios - 用于转换以修复 objc_msgSend 错误数量的参数错误的 self 类型和委托(delegate)?

转载 作者:行者123 更新时间:2023-11-29 00:40:24 25 4
gpt4 key购买 nike

我有一个 iPad 应用程序,是几年前使用 Greg Coombs 编写的 IntelligentSplitViewController它允许人们生成类似于 iPhone 应用程序中可旋转的 UITabBarController 的布局。最近发布的 iOS 10 以一种方式打破了这一点 previously been described对于此列表中的早期版本: objc_msgSend 给出一条错误消息:参数数量有限,而预期为 0。

@rintaro 对此的回答是执行类型转换到另一个方法 (typed_msgSend) 以代替 objc_msgSend。为了响应其他发帖者的带有两个参数的代码,这是:

id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;

Greg 的代码稍微复杂一些,考虑到我在 Objective-C 方面的弱点,我很难做与他的代码类似的事情。 (不幸的是,格雷格生病了,并不再支持这一点。)详细信息如下:

- (void)willRotate:(NSNotification*)notification
{
...
if (UIInterfaceOrientationIsPortrait(toOrientation))
{
@try
{
UIPopoverController *popover = [super valueForKey:@"_hiddenPopoverController"];
objc_msgSend(theDelegate, @selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:), self, master, button, popover);
...

所以问题是六个参数的数据类型是什么?我的尝试是:

  1. theDelegate - 不确定 - 尝试了“id”或“id ”(来自其声明)
  2. @selector... — SEL(类比答案)
  3. self - 真的不知道 - 尝试过“id”
  4. master — UIViewController*(来自声明)
  5. 按钮 — UIBarButtonItem*(来自声明)
  6. popover — UIPopoverController*(来自声明)

这会构建,但在启动画面后会在 main 中崩溃。当然,它可能会因为其他原因而崩溃,但除非我确定我的类型转换是正确的,否则我无法知道。 (我多么希望这是 Java。)

最佳答案

void (*my_objc_msgSend)(id, SEL, id, id, id, id) = (__typeof(my_objc_msgSend))objc_msgSend;  
my_objc_msgSend(theDelegate, @selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:), self, master, button, popover);

在objc中,id是struct的一个点。任何对象(从 NSObject 继承的类)都可以使用 id 代替。

如果仍然崩溃,请发布日志。

在 iOS 9 之后,splitViewController:willHideViewController:withBarButtonItem:forPopoverController: 已弃用,您应该改用 splitViewController:willChangeToDisplayMode:

关于ios - 用于转换以修复 objc_msgSend 错误数量的参数错误的 self 类型和委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663295/

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