SDK 8.1在iOS 8.1下运行时会出现此问题,但在iOS 7下运行时则不会出现此问题.仅适用于iPad.问题出现在模拟器和硬件设备上.
下面的代码演示了一个视图控制器,它包含一行UITableView,其中包含一行UIButton.点击按钮或行将导致弹出窗口出现.点击按钮时这很好用,但是当点击表视图的行时,弹出窗口会有一些延迟.在我的测试中,我第一次点击行时弹出窗口通常会出现很少或没有延迟,但是第二次点击该行时,弹出窗口可能需要几秒钟才会出现,并且通常直到我点击其他地方才出现风景.但是,即使在行上的第一次敲击时也会发生延迟(特别是在硬件上测试时).
我展示的代码已经尽可能地降低了,同时保留了问题.在我看来,UITableView在某种程度上是导致这种延迟发生的关键.
我知道在iOS 8中不推荐使用某些UIPopoverController代码.我试图在iOS 8中使用UIPopoverPresentationController,结果是相同的:在弹出窗口出现之前有时会有很长的延迟.我对这种新方法还不是很熟悉,所以我可能会犯错误,但无论如何都可以通过将USE_TRADITIONAL_METHOD宏设置为0而不是1来测试iOS 8代码.
任何有关如何修复或绕过此建议(同时仍使用tableview)的建议将不胜感激.
#import "MyViewController.h"
@interface MyViewController ()
@property (nonatomic) UIPopoverController* myPopoverController;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// setup table view
UITableView* tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 500, 500) style:UITableViewStyleGrouped];
[self.view addSubview:tableView];
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
tableView.dataSource = self;
tableView.delegate = self;
// setup button
UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
[self.view addSubview:button];
button.frame = CGRectMake(20, 550, 100, 20);
[button setTitle:@"Show popover" forState:UIControlStateNormal];
[button addTarget:self action:@selector(showPopover:) forControlEvents:UIControlEventTouchUpInside];
} …Run Code Online (Sandbox Code Playgroud)我开始认为我的问题的答案是"不",但我仍然对此感到困惑和不确定.所以请确认.我已经了解了在使用多线程的Core Data时要小心.NSManagedObjectContext对象不得跨越线程边界.作为一个同时具有线程和核心数据的新手,我很高兴地发现GCD应该可以使其中的一些变得更容易.
或许,我想我会简单地创建一个专用的GCD调度队列来处理核心数据(如果需要,甚至可以有多个调度队列,每个队列都有自己的核心数据上下文).那会很简单.
但现在我意识到GCD调度队列的一大优势是它根据需要管理和使用多个线程.所以 - 如果我理解这一点 - 我交给同一个调度队列的任务最终可能会在不同的线程中运行,可能会将核心数据上下文从一个线程切换到另一个线程,并且出现问题.是对的吗?
我已经阅读了许多相关的问题和答案,例如Core Data和threads/Grand Central Dispatch,但我仍然有些困惑.使用GCD队列接受的问题答案确实确保在每个线程上创建新的上下文,但没有指出这样做的必要性.另一个答案是"您可以在名为com.yourcompany.appname.dataaccess的队列上执行所有CoreData工作",这似乎暗示只要Core Data工作仅限于一个GCD调度队列,那么一切正常.也许不是.
此问题与使用 Xcode 12.4 (SwiftUI 2) 的macOS应用程序(不是 iOS 或 Catalyst)的 SwiftUI 有关。问题在于,编辑列表内的文本字段效果不佳,事实上,它的效果非常差,以至于一开始我以为我根本无法编辑它。
这是代码,只是一个简单的例子:
import SwiftUI
struct ContentView: View {
@State var name1 = "Hans"
@State var name2 = "E"
@State var name3 = ""
var body: some View {
List {
TextField("Name 1", text: $name1)
TextField("Name 2", text: $name2)
TextField("Name 3", text: $name3)
}
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我尝试编辑字段时的经历:
我希望这不是预期的行为。对于仅包含单个字符的字段来说,这尤其成问题,使用户感到困难(必须准确地点击“E”)。我在这里做错了什么吗?
我注意到问题Editable TextField in SwiftUI List,它有点相似,但该问题报告 TextField …
我认为我理解基本的Objective-C就alloc和init ...方法而言,但显然我没有.我把我遇到的问题归结为下面的最小例子.(对于示例,我将所有源都放在一个文件中,但如果源被分成多个源文件和头文件,问题就会发生,就像通常那样).
以下是代码执行操作以及运行时会发生什么的概要.
我定义了两个类MyInteger和MyFloat,它们几乎完全相同,除了一个使用float处理类型为int的另一个类.两者都有名为initWithValue的初始化方法:但是使用不同类型的参数.有一个#define来控制是否定义了MyInteger类,原因是它导致程序的不同行为,即使该类从未使用过.
main()仅使用MyFloat.前两行执行此操作:分配MyFloat的实例,并使用值50.0初始化它.然后打印该值.根据是否定义了MyInteger,我得到两个不同的输出.
没有定义MyInteger,就像我期望的那样:
[4138:903] float parameter value:50.000000
[4138:903] Value:50.000000
(next two output lines omitted)
Run Code Online (Sandbox Code Playgroud)
使用MyInteger定义,令我惊讶的是:
[4192:903] float parameter value:0.000000
[4192:903] Value:0.000000
(next two output lines omitted)
Run Code Online (Sandbox Code Playgroud)
在我看来,编译器处理对initWithValue的调用:就像它属于MyInteger类一样.接下来的两行main()通过将[MyFloat alloc]转换为MyFloat*来测试它.这确实产生了预期的输出,即使定义了MyInteger:
[4296:903] float parameter value:0.000000
[4296:903] Value:0.000000
[4296:903] float parameter value:50.000000
[4296:903] Value with cast:50.000000
Run Code Online (Sandbox Code Playgroud)
请解释发生了什么!我现在已经挣扎了超过24小时,甚至到了打开大门以让一些热量消失的程度,所以我的电脑可能会降温:-)谢谢!
另一个奇怪的是,如果我将MyInteger的定义移到MyFloat的定义之下,那么一切都"好" - 按照我的预期工作.历史证明我经常错误地怀疑编译器应该受到指责.在任何情况下,这里是编译器和项目信息:使用Xcode 4.0.2.尝试使用所有3个编译器选项(GCC 4.2,LLVM GCC 4.2和LLVM编译器2.0).此示例的Xcode项目是使用基于Foundation的Mac OS X命令行工具的标准配置设置的.
#define DO_DEFINE_MYINTEGER 1
//------------- define MyInteger --------------
#if DO_DEFINE_MYINTEGER
@interface MyInteger : NSObject {
int _value;
}
-(id)initWithValue:(int)value;
@end
@implementation MyInteger
-(id)initWithValue:(int)value {
self= [super …Run Code Online (Sandbox Code Playgroud) ios ×2
objective-c ×2
core-data ×1
ios8.1 ×1
macos ×1
swiftui ×1
textfield ×1
uitableview ×1
xcode4 ×1