我有一个应用程序,在视图的下半部分有一个文本字段.这意味着当我输入文本字段时键盘覆盖文本字段.
如何在打字时向上移动视图以便我可以看到我正在键入的内容,然后在键盘消失时将其移回原来的位置?
我到处都看,但所有解决方案似乎都在Obj-C中,我还没有完全转换.
任何帮助将不胜感激.
我现在遇到了几个案例,它们可以方便地找到"最顶层"的视图控制器(负责当前视图的控制器),但还没有找到办法.
基本上挑战是这样的:假设一个人在一个不是视图控制器(或视图)的类中执行[并且没有活动视图的地址]并且还没有传递最顶层视图控制器的地址(或者说,导航控制器的地址),是否可以找到该视图控制器?(如果是这样,怎么样?)
或者,如果失败了,是否有可能找到最顶层的视图?
我正在尝试为iPhone构建输入屏幕.屏幕有许多输入字段.其中大多数位于屏幕顶部,但两个字段位于底部.当用户尝试编辑屏幕底部的文本时,键盘将弹出并覆盖屏幕.我找到了一个简单的解决方案,可以在发生这种情况时将屏幕向上移动,但结果是屏幕总是向上移动,当用户尝试编辑屏幕时,屏幕顶部的字段会移动.
有没有办法让屏幕只在编辑底部字段时移动?
我使用了这里找到的代码:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Run Code Online (Sandbox Code Playgroud) 我有一个UITableView与UITextFieldS作为细胞.当UITableView触摸背景时,我想解除键盘.我试图通过创建一个UIButton大小UITableView并将其放在后面来做到这一点UITableView.唯一的问题是,UIButton即使触摸在UITableView上,也能捕获所有触摸.我究竟做错了什么?
谢谢!
我使用拆分视图控制器作为初始视图控制器开始我的项目,并从故事板自动启动它.
一般地,通过该用户界面的应用程序有一个且只有一个拆分视图控制器作为根,所以我创建一个静态变量在子类,并将其设置初始化已完成时.
所以我想用swift试试这个行为.
我在iBook上阅读了关于Type属性(带有static和class关键字)的Swift编程语言指南,并尝试了一段代码:
import UIKit
class SplitViewController: UISplitViewController {
class func sharedInstance() -> SplitViewController {
return SplitViewController.instance
}
class let instance: SplitViewController = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialization()
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder);
self.initialization()
}
func initialization() {
SplitViewController.instance = self;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当Xcode说不支持类型属性的class关键字时,我想通了.

你有解决方案吗?
在Mac OS X中,您可以找到第一个响应者:
[[self window] firstResponder]
Run Code Online (Sandbox Code Playgroud)
在iOS中有什么办法吗?或者您是否需要枚举子控件isFirstResponder并向每个控件发送消息?
我在这里看到的帖子表明,UIScrollViews如果子视图UITextField成为第一个响应者,应自动滚动; 但是,我无法弄清楚如何让它发挥作用.
我已经是一个UIViewController具有UIScrollView与内UIScrollView有多个文本框.
如果有必要,我知道如何手动完成此操作; 但是,从我一直在阅读的内容来看,似乎可以让它自动滚动.请帮忙.
我用ScrollView填充了我的视图(与视图大小相同),当用户点击View(或scrollview)中的其他位置时,我仍然坚持如何辞退第一响应者.有关如何做到这一点的任何想法?我正在使用以下方法,但它没有按预期工作:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助,
斯特凡
有谁知道,我可以在iPhone应用程序中获得当前的输入语言和/或键盘布局吗?输入语言更改后,我还可以收到通知吗?
根据iOS文档,响应者链用于"向上传递"触摸事件.它也用于控件生成的操作.精细.
我真正想做的是发送自定义事件"上链".接收事件的第一响应者将处理它.这似乎是一个非常常见的模式,但我找不到任何关于如何做到"iOS/Cocoa方式"的好解释.
由于响应链正是我所需要的,我提出了这样的解决方案:
// some event happened in my view that
// I want to turn into a custom event and pass it "up":
UIResponder *responder = [self nextResponder];
while (responder) {
if ([responder conformsToProtocol:@protocol(ItemSelectedDelegate)]) {
[responder itemSelected:someItem];
break;
}
responder = [responder nextResponder];
}
Run Code Online (Sandbox Code Playgroud)
这很有效,但我觉得应该有其他方法来处理这个问题.手动走链子这种方式似乎不太好......
请注意,通知在这里不是一个好的解决方案,因为我只希望参与视图层次结构中的对象,并且通知是全局的.
在iOS中处理这个问题的最佳方法是什么(和Cocoa一样)?
编辑:
我想要完成什么?
我有一个视图控制器,它有一个视图,有子视图等...几个子视图是一个特定类型,显示数据库中的项目.当用户点击此视图时,应将信号发送到控制器以导航到此项目的详细信息页面.
处理点击的视图位于视图层次结构中主视图下方的几个级别.我必须告诉控制器(或在某些情况下,特定的子视图"向上链")选择了一个项目.
听通知是一种选择,但我不喜欢这种解决方案,因为选择一个项目不是全局事件.它严格依赖于当前的视图控制器.
ios ×8
iphone ×4
swift ×3
keyboard ×2
objective-c ×2
uikeyboard ×2
uikit ×2
uiscrollview ×2
uitextfield ×2
cocoa ×1
cocoa-touch ×1
events ×1
ios4 ×1
uiresponder ×1
uitableview ×1
uiview ×1
xcode ×1
xcode6 ×1