【问题标题】:iPhone: How to fix inputAccessoryView to View?iPhone:如何将 inputAccessoryView 修复为 View?
【发布时间】:2011-07-21 23:43:22
【问题描述】:

我有一个工具栏,我需要在编辑文本时使用它,什么时候不需要。

在以前的应用中,我手动移动了工具栏(监听通知等)

但我想使用inputAccessoryView...所以在我的viewDidLoad 中,我愿意

for (/*myTextFields*/) {
   textField.inputAccessoryView = keyboardToolbar;
}
[self.view addSubView:keyboardToolbar];

效果很好,工具栏出现,我点击一个文本字段,工具栏向上滑动 - 一切都很好。 但是当我随后隐藏键盘时,inputAccessoryView 将我的工具栏拖离屏幕。有什么方法可以告诉inputAcessoryView 它的固定位置在哪里? - 还是我必须回到我以前的收听通知方式等...?

【问题讨论】:

  • 我一直在试图找出一种方法来做这件事(在我的例子中,我试图复制 iOS 消息 UX)。使用辅助视图似乎 是个好主意,因为它会为您处理动画。我想我又回到了通知中......

标签: ios iphone uitextfield uitoolbar


【解决方案1】:

我通过监听通知并向上移动工具栏解决了这个问题......哦,好吧。

这样的事情可以完成:

- (void)viewWillAppear:(BOOL)animated 
{
    [super viewWillAppear:animated];
    /* Listen for keyboard */
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification 
{
    [keyboardToolbar setItems:itemSetFull animated:YES];
    /* Move the toolbar to above the keyboard */
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 210.0;
    self.keyboardToolbar.frame = frame;
    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification 
{
    [keyboardToolbar setItems:itemSetSmall animated:YES];
    /* Move the toolbar back to bottom of the screen */
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - frame.size.height;
    self.keyboardToolbar.frame = frame;
    [UIView commitAnimations];
}

我猜输入附件视图实际上只是用于卡在键盘顶部的东西:)

【讨论】:

  • 对。您最初的方法之所以如此,是因为一个视图不能有多个超级视图。一旦键盘出现在您的一个文本字段中,它就会将输入附件视图添加到键盘视图中,如果有的话,它会自动将其从原始超级视图中删除。它不会跟踪它曾经的位置,因此对于您希望您的解决方案在这里的行为是必要的。我认为短信应用也可以这样做;它有一个持久栏,当键盘可见时,它会出现在键盘上方,但当键盘被关闭时,它会固定在底部。
【解决方案2】:

我最近想通了,似乎很少有人知道。所以,我想把你引向这个答案:https://stackoverflow.com/a/24855095/299711,我将在下面复制:

将您的 UIToolbar 分配给视图控制器中的属性:

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar;

在您的顶视图控制器中,添加以下方法:

- (BOOL)canBecomeFirstResponder{

    return YES;

}

- (UIView *)inputAccessoryView{

    return self.inputAccessoryToolbar;

}

然后(可选,因为通常不需要),只要键盘被隐藏,只需调用:

[self becomeFirstResponder];

这样,您的 inputAccessoryToolbar 将同时是您的视图控制器和文本视图的输入附件视图。

【讨论】:

  • 这会产生一个保留周期,并且 UIViewController 永远不会被释放。内存泄漏
  • 我使用了您在答案中粘贴的确切代码。唯一的区别是我的 AccessoryView 是在 Storyboard 上实例化的,并且我持有对 IBOutlet 的弱引用。
  • 这实际上听起来可能会导致问题,因为输入附件视图需要强引用。也许您可以尝试在视图控制器中创建另一个强引用的工具栏,然后将其设置为输入附件视图,以检查是否是导致问题的原因?
  • 是的,我试过了。我创建了一个具有强引用和 UITextView 子视图的自定义视图,并将其分配给 UIViewController inputAccessoryView。引用被保留,并且 UIViewController 永远不会被释放。如果您创建一个简单的导航应用程序,并且带有 inputAccessoryView 的 UIViewController 是第二个,您可以重现这一点。当你弹出它时,它永远不会调用 -dealloc
  • 如果您有空闲时间,请尝试一下,如果不只是我,请告诉我......这让我很烦。
猜你喜欢
  • 2018-02-27
  • 2019-02-14
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多