小编ren*_*ene的帖子

UIPopoverController出现在iOS 8.1下的不可预知的延迟

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)

objective-c uitableview uipopovercontroller ios ios8.1

16
推荐指数
1
解决办法
2409
查看次数

GCD调度队列是否足以将Core Data上下文限制在单个线程中

我开始认为我的问题的答案是"不",但我仍然对此感到困惑和不确定.所以请确认.我已经了解了在使用多线程的Core Data时要小心.NSManagedObjectContext对象不得跨越线程边界.作为一个同时具有线程和核心数据的新手,我很高兴地发现GCD应该可以使其中的一些变得更容易.

或许,我想我会简单地创建一个专用的GCD调度队列来处理核心数据(如果需要,甚至可以有多个调度队列,每个队列都有自己的核心数据上下文).那会很简单.

但现在我意识到GCD调度队列的一大优势是它根据需要管理和使用多个线程.所以 - 如果我理解这一点 - 我交给同一个调度队列的任务最终可能会在不同的线程中运行,可能会将核心数据上下文从一个线程切换到另一个线程,并且出现问题.是对的吗?

我已经阅读了许多相关的问题和答案,例如Core Data和threads/Grand Central Dispatch,但我仍然有些困惑.使用GCD队列接受的问题答案确实确保在每个线程上创建新的上下文,但没有指出这样做的必要性.另一个答案是"您可以在名为com.yourcompany.appname.dataaccess的队列上执行所有CoreData工作",这似乎暗示只要Core Data工作仅限于一个GCD调度队列,那么一切正常.也许不是.

core-data thread-safety grand-central-dispatch ios

15
推荐指数
1
解决办法
4643
查看次数

macOS 上 SwiftUI 中列表内的 TextField:编辑效果不佳

此问题与使用 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)

具有焦点的文本字段

这就是我尝试编辑字段时的经历:

  • 对于非空字段,单击现有文本:它可以工作(在短暂但烦人的 0.5 秒延迟之后)。
  • 对于非空字段,在现有文本外部单击:不会发生任何情况。
  • 对于空字段(“名称 3”),单击字段中的任意位置:它可以工作(稍有延迟后)。
  • 双击任意字段内的任意位置:什么也不会发生。

我希望这不是预期的行为。对于仅包含单个字符的字段来说,这尤其成问题,使用户感到困难(必须准确地点击“E”)。我在这里做错了什么吗?

我注意到问题Editable TextField in SwiftUI List,它有点相似,但该问题报告 TextField …

macos textfield swiftui

7
推荐指数
1
解决办法
950
查看次数

在初始化时,alloc返回的Objective-C类与错误的类混淆

我认为我理解基本的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)

objective-c xcode4

5
推荐指数
1
解决办法
577
查看次数