【问题标题】:missing copy/paste menu in UITextField/UIWebViewUITextField/UIWebView 中缺少复制/粘贴菜单
【发布时间】:2011-06-20 16:36:38
【问题描述】:

我遇到了问题,找不到解决方法。

我有一个UIWebView 实现和UITextField 的视图。 在两者上,当我点击时,都没有出现复制/粘贴菜单。

UIWebView 中有文本(仅文本),我可以选择一个单词或一个段落,或者让放大镜出现并手动选择我想要的文本。

另一方面,UITextField 可以接受输入并按预期工作,但复制/粘贴功能除外。

没有什么是子分类的。对于复制/粘贴功能,我只需要 iOS 的默认实现。

这个问题不在单一视图中。我有另一个 UIWebView 在其他地方也有同样的问题,所以我认为这是一个全球性问题。

我已经完成了所有显而易见的事情(导入 UIKit 和 Foundation 框架、分配属性、发布等),但我再次陷入困境。

什么可能会与如此简单的功能发生交互/干扰,从而禁用它? 此外,总是在最简单的实现下,这还需要什么? (我缺少的任何框架,任何属性等)。

这么简单的事情,我被它困住了。 如果有人有任何想法,非常感谢。

==== 编辑 ====

问题不是由我在任何视图或类中的代码引起的。

我添加了一个新视图(该应用程序是基于标签栏的),其中只有一个 UITextField 和一个 UITextView 以及默认的“Lorem Ipsum”文本。 在 textView 上,我也可以选择文本,但没有菜单可以复制/粘贴/选择/全选。 这也发生在没有粘贴菜单出现的文本字段(空)中(我从另一个应用程序复制了一些文本,例如 Safari 或 Notes)。

似乎问题出在其他地方,在所有视图中普遍影响应用程序。

我删除了框架引用并将它们放回去,但什么也没发生。 我仍在试图弄清楚这是从哪里来的。

【问题讨论】:

    标签: iphone ios ipad


    【解决方案1】:

    我遇到了同样的问题 - 其他一切都正常工作,但所有 UITextViews 在所有应用程序中都缺少全局“复制/粘贴/选择”菜单。

    经过一些实验,我发现原因是:

    “在启动时可见”属性未在 MainWindow.xib 中的窗口上设置

    在 AppDelegate 的 application:didFinishLaunchingWithOptions: 方法中缺少对 [self.window makeKeyAndVisible] 的调用。

    修复 任何 后,它工作正常。试试看。

    【讨论】:

    • 就是这样,如果您在 xcode 3 中创建项目,它还需要 makeKeyandVisible,非常感谢。
    • 刚刚遇到这个问题。 [窗口 makeKeyAndVisible] 解决了它。伟大的侦探工作!
    • 这对我没有帮助
    【解决方案2】:

    如果您使用 Xcode 11+ 和 iOS 13+ 项目(和SceneDelegate),

    确保您按照确切的顺序应用更改:

    import UIKit
    
    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
    
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            guard let windowScene = (scene as? UIWindowScene) else { return }
            window = UIWindow()
            window!.rootViewController = rootNavigation
            window!.windowScene = windowScene
            window!.makeKeyAndVisible()
        }
    }
    

    因为,如果你会这样应用它:

        window!.makeKeyAndVisible()
        window!.windowScene = windowScene
    

    您将在问题中描述问题。它会出现并且看起来很好,可以工作,但不会出现复制粘贴操作。我花了一段时间才发现这一点。

    【讨论】:

    • 谢谢。这解决了这个问题。你太棒了!
    • 这是正确答案。有谁知道为什么这可以解决问题?
    【解决方案3】:

    确保你实施:

    //init your menu somewhere, appropiately
    
    - (id) initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
    
            NSMutableArray *items = [[[UIMenuController sharedMenuController] menuItems] mutableCopy];
            if (!items) items = [[NSMutableArray alloc] init];
    
            UIMenuItem *menuItem;
            menuItem = [[UIMenuItem alloc] initWithTitle:@"Undo" action:@selector(undo:)];
            [items addObject:menuItem];
            [menuItem release];
            menuItem = [[UIMenuItem alloc] initWithTitle:@"Redo" action:@selector(redo:)];
            [items addObject:menuItem];
            [menuItem release];
    
            [[UIMenuController sharedMenuController] setMenuItems:items];
                [items release];
    
        }
        return self;
    }
    
    //allow other items to appear and yours too :) Perhaps you are missing this?
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
        if ([super canPerformAction:action withSender:sender]) {
            return YES;
        }
        else {
            //write your code here
            if (action == @selector(undo:) && [self.undoManager canUndo]) return YES;
            if (action == @selector(redo:) && [self.undoManager canRedo]) return YES;
        }
        return NO;
    }
    
    //Do your actions 
    - (void)undo:(id)sender{
    //do your stuff here
    }
    - (void)redo:(id)sender{
    //do your stuff here
    }
    

    【讨论】:

    • 我试过 canPerformAction: (单独)但没有结果。在 initWithFrame 上,self = [super initWithFrame:frame] 会产生警告 UIViewController may not respond。
    • 只是为了完成目的,这段代码应该写在你试图显示菜单的视图中。不是 UIViewController。 (因为你没有继承任何东西,所以你不需要这个,抱歉我错过了一些东西)
    【解决方案4】:

    好的,我找到了解决方案。 这与代码或对象的属性无关。 它或多或少是 XCode4 的“实现”。

    当创建一个新的通用项目时,xcode 会在项目的根目录中放置一个 AppDelegate,并在每个文件夹中再放置 2 个 AppDelegate,一个用于 iPad,另一个用于 iPhone。

    根应用委托看起来像

    #import <UIKit/UIKit.h> 
    @interface SampleAppDelegate : NSObject <UIApplicationDelegate> { }
    @property (nonatomic, retain) IBOutlet UIWindow *window;
    

    #import "SampleAppDelegate.h"
    @implementation SampleAppDelegate
    @synthesize window=_window;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
        [self.window makeKeyAndVisible];
        return YES;
    }
    - (void)dealloc
    {
        [_window release];
        [super dealloc];
    }
    @end
    

    iPhone 和 iPad 应用 Delegates 没有“窗口”引用。

    如果根 AppDelegate 被删除并且“窗口”代码在每个特定于设备的 AppDelegate 中移动,则选择/全选/复制/粘贴(或任何其他选项)菜单会再次出现。

    这发生在我创建的第一个新 xcode4 上。我记不清 xcode3 是否有类似的实现(但我认为没有)。

    【讨论】:

    • 您是否找到了不删除根委托的解决方案。我已将窗口移至 iphone / ipad 代表,但仍看不到复制和粘贴
    • 还没有尝试过。通过这样做,我也解决了其他问题(例如,iPad 键盘右下角的“键盘隐藏”按钮开始工作)。我认为这是因为该项目最初是在 xcode3 上创建的,并且在传递 Xcode4 之后,一些剩菜完成了这项工作(可能)。我假设在 xcode4 上创建的新项目不会有问题。这是一个非常奇怪的案例,这个解决方案或多或少是一种解决方法。
    【解决方案5】:

    看起来,现在(2020 年)iOS 出现了错误。当您将 UITextField 的对齐方式更改为居中 (NSTextAlignmentCenter) 时,您无法触发粘贴空白字段等操作。

    也许这也是你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多