- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经编写了自己的函数来在键盘出现时向上滚动文本字段。为了通过从文本字段上轻击来关闭键盘,我创建了一个 UITapGestureRecognizer,它负责在轻击时退出文本字段上的第一响应者。
However, when selecting one of the entries in the auto completed table, didSelectRowAtIndexPath does not get called.相反,点击手势识别器似乎正在被调用并且只是辞去了第一响应者。
我猜想有一些方法可以告诉点按手势识别器继续将点按消息向下传递到 UITableView,但我不知道它是什么。在 objc 和 9 多年前关于 stack overflow 的帖子中只有解决方案,我想知道是否有更新的解决方案!谢谢,如果您想查看发生了什么,这是我的代码:
class ChatLogController : UIViewController, UITextFieldDelegate , UITableViewDelegate , UITableViewDataSource, UIGestureRecognizerDelegate, UIImagePickerControllerDelegate ,UINavigationControllerDelegate {
var messages = [Message]()
var user : User?{
didSet{
observeMessages()
}
}
@IBOutlet weak var tabelView: UITableView!
@IBOutlet weak var messageTextField: UITextField!
@IBOutlet weak var bottomViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var currentMessageRecieverImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
currentMessageRecieverImage.translatesAutoresizingMaskIntoConstraints = false;
currentMessageRecieverImage.layer.cornerRadius = 30;
currentMessageRecieverImage.layer.masksToBounds = true
currentMessageRecieverImage.contentMode = .scaleAspectFill
if let currentMessageRecieverUser = user{
currentMessageRecieverImage.loadImageUsingCacheWithUrlString(urlString: currentMessageRecieverUser.picURL!);
print(currentMessageRecieverUser.userName!)
}
tabelView.delegate = self;
tabelView.dataSource = self;
messageTextField.delegate = self;
let dragAwayFromTextGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleTapAwayFromTextEdit))
dragAwayFromTextGesture.direction = UISwipeGestureRecognizerDirection.down
dragAwayFromTextGesture.delegate = self;
tabelView.addGestureRecognizer(dragAwayFromTextGesture)
let dragBackToMessages = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeBackToMessages))
dragBackToMessages.direction = UISwipeGestureRecognizerDirection.right
dragBackToMessages.delegate = self;
tabelView.addGestureRecognizer(dragBackToMessages)
let TapAwayFromTextEditTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapAwayFromTextEdit))
tabelView.addGestureRecognizer(TapAwayFromTextEditTapGesture)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
@objc func handleSwipeBackToMessages(){
dismiss(animated: false, completion: nil)
}
func observeMessages(){
guard let uid = Auth.auth().currentUser?.uid else{
return;
}
// ref gets user that is logged in
let ref = Database.database().reference().child("user-messages").child(uid)
ref.observe(.childAdded) { (snapshot) in
// gets needed messages
let messageId = snapshot.key
let messagesRef = Database.database().reference().child("messages").child(messageId)
messagesRef.observe(.value, with: { (snapshot) in
guard let dict = snapshot.value as? [String : AnyObject] else{
return
}
let message = Message()
message.imageUrl = dict["imageurl"] as? String
message.fromId = dict["fromid"] as? String
message.text = dict["text"] as? String
message.timestamp = dict["timestamp"] as? String
message.toId = dict["toid"] as? String
if message.chatPartnerId() == self.user?.toId{
self.messages.append(message)
}
DispatchQueue.main.async {
self.tabelView.reloadData()
}
})
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellid" , for: indexPath) as! CustomChatTableViewCell;
let gray = UIColor(red:0.94, green:0.94, blue:0.94, alpha:1.0)
let red = UIColor(red:1.00, green:0.22, blue:0.37, alpha:1.0)
let message = messages[indexPath.item]
if message.toId == user?.toId{
cell.messageBackground.backgroundColor = red
cell.messageLabel.textColor = UIColor.white
}
else{
cell.messageBackground.backgroundColor = gray
cell.messageLabel.textColor = UIColor.black
}
cell.messageLabel.text = message.text
if message.imageUrl != nil{
//print(message.imageUrl!)
// cell.messageImageView.image = UIImage(named : "user.jpg")
cell.messageImageView.loadImageUsingCacheWithUrlString(urlString: message.imageUrl!)
//print(cell.messageImageView.image.debugDescription)
cell.messageImageView.isHidden = false;
cell.messageImageView.translatesAutoresizingMaskIntoConstraints = false;
cell.messageImageView.contentMode = .scaleAspectFill
cell.messageLabel.isHidden = true
cell.messageBackground.isHidden = true;
}
else
{
cell.messageImageView.isHidden = true;
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.messageLabel.isHidden = false
cell.messageBackground.isHidden = false;
}
return cell;
}
@objc func handleTapAwayFromTextEdit(){
//print("handle tap away from text edit running ")
messageTextField.endEditing(true)
}
@IBAction func backToMessageListPressed(_ sender: Any) {
dismiss(animated: false, completion: nil)
}
@IBAction func infoButtonPressed(_ sender: Any) {
}
// saves text to fire base
@IBAction func sendButtonPressed(_ sender: Any) {
handleSendMessageToDataBase()
}
func handleSendMessageToDataBase(){
let ref = Database.database().reference().child("messages")
// needed for making list in firebase for unique texts
let childRef = ref.childByAutoId()
if messageTextField.text == ""{
return
}
if let message = messageTextField.text{
let toID = user!.toId!
let fromId = Auth.auth().currentUser!.uid
let timeStamp : Int = Int(Int(NSDate().timeIntervalSince1970))
print(timeStamp)
let values = ["text" : message , "toid" : toID , "timestamp" : "\(timeStamp)" , "fromid" : fromId]
childRef.updateChildValues(values, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
return
}
let userMessagesref = Database.database().reference().child("user-messages").child(fromId)
let messageID = childRef.key
userMessagesref.updateChildValues([messageID: 1])
let recipientUserMessageRef = Database.database().reference().child("user-messages").child(toID)
recipientUserMessageRef.updateChildValues([messageID: 1])
})
}
messageTextField.text = ""
messageTextField.endEditing(true)
}
@IBAction func sendImageButtonPressed(_ sender: Any) {
handleSendImage()
}
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
print("You selected cell #\(indexPath.row)!")
}
func handleSendImage(){
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
present(imagePickerController, animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicker : UIImage?
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage{
selectedImageFromPicker = editedImage
}
else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage{
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker{
uploadToFireBaseUsingSelectedImage(selectedImage : selectedImage)
}
dismiss(animated: true, completion: nil)
}
private func uploadToFireBaseUsingSelectedImage(selectedImage :
UIImage){
let imageName = NSUUID().uuidString
let refToStorage = Storage.storage().reference().child("message_images").child(imageName)
if let uploadData = UIImageJPEGRepresentation(selectedImage, 0.2){
refToStorage.putData(uploadData, metadata: nil, completion: { (metaData, error) in
if error != nil{
print("failed to upload firebase image when sending in chatlogcontroller")
print(error!)
return
}
if let imageURL = metaData?.downloadURL()?.absoluteString{
self.sendMessageWithImageURL(imageURL: imageURL)
}
})
}
}
private func sendMessageWithImageURL(imageURL : String){
let ref = Database.database().reference().child("messages")
// needed for making list in firebase for unique texts
let childRef = ref.childByAutoId()
let toID = user!.toId!
let fromId = Auth.auth().currentUser!.uid
let timeStamp : Int = Int(Int(NSDate().timeIntervalSince1970))
print(timeStamp)
let values = ["imageurl" : imageURL , "toid" : toID , "timestamp" : "\(timeStamp)" , "fromid" : fromId]
childRef.updateChildValues(values, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
return
}
let userMessagesref = Database.database().reference().child("user-messages").child(fromId)
let messageID = childRef.key
userMessagesref.updateChildValues([messageID: 1])
let recipientUserMessageRef = Database.database().reference().child("user-messages").child(toID)
recipientUserMessageRef.updateChildValues([messageID: 1])
})
}
func textFieldDidBeginEditing(_ textField: UITextField) {
UIView.animate(withDuration: 0.2, animations:{
self.bottomViewHeightConstraint.constant = 308;
self.view.layoutIfNeeded()
})
}
func textFieldDidEndEditing(_ textField: UITextField) {
UIView.animate(withDuration: 0.2, animations:{
self.bottomViewHeightConstraint.constant = 50;
self.view.layoutIfNeeded()
})
}
func configureTableView()
{
tabelView.delegate = self;
tabelView.dataSource = self;
tabelView.register(UINib(nibName: "MessageCell" , bundle : nil), forCellReuseIdentifier: "customMessageCell");
tabelView.allowsSelection = true;
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self);
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let message = messages[indexPath.item]
if message.imageUrl != nil{
return 200
}
return (CGFloat((message.text?.count)! + 70) )
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
handleSendMessageToDataBase()
return true
}
最佳答案
解决方案是将 TapAwayFromTextEditTapGesture
的属性 cancelsTouchesInView
设置为 false
。这将导致它将触摸传递给 TableView 。
来自Apple documentation on this property (我强调):
When this property is true (the default) and the receiver recognizes its gesture, the touches of that gesture that are pending are not delivered to the view and previously delivered touches are cancelled through a touchesCancelled(_:with:) message sent to the view. If a gesture recognizer doesn’t recognize its gesture or if the value of this property is false, the view receives all touches in the multi-touch sequence.
关于ios - didSelectRowAtIndexPath 没有被调用,因为 UI 点击手势 Swift 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47646425/
我需要在 didSelectRowAtIndexPath 方法内部再次调用 UITableView 中的 didSelectRowAtIndexPath 方法。 代码如下: -(void)tableV
我正在尝试在单元格创建 cellForRowAt 中手动调用 didSelectRowAtIndexPath,因为这将更新详细 View 而无需实际触摸该行,但是当我这样做时所以我在实际委托(dele
出于某种原因,我无法在以下代码中的第一个 IF 语句之后访问任何变量。例如,如果索引路径为[0,0],则变量phoneText 会输出电话号码。但如果它是 [1,0] 或 [2,0],我会得到“nul
我知道之前提到过这个问题,但那里的解决方案并不适用。我有一个使用 IB 设置的带有嵌入式 UITableViewController 的 UINavigationController 。在IB中,UI
我遇到了 ios 5 的 UITableView 的 didSelectRowAtIndexPath 问题,这在 ios 4 中是正确的。 第一次点击表中的任何行时,不会调用该方法。一旦我选择另一行,
我有一个 Viewcontroller,它是 UITableViewController 的子类。基本上我的问题是当我们点击主按钮时委托(delegate)方法被调用: - (void)tableVi
我在 uitextfield 正下方有一个 uitableview,它在 uitableview 单元格 中填充类似的字符串。项目被填充。但是,长按后会调用 didSelectRowAtIndexPa
所以我试图默认在我的 View 首次加载时选择 tableView 中的第一行。我正在这样做我的 viewWillAppear 方法: NSIndexPath *tempPath= [NSIndexP
我想在某个条件不满足时中止这个方法,我该怎么做? 我不使用 tableView:willSelectRowAtIndexPath: 方法。我认为可以结合这两种方法来防止某些行被选择并被推送到另一个 V
我有一个分为2个部分的UItableView。 我如何管理tableView didSelectRowAtIndexPath方法? 对于第1部分,该方法正在运行,但是对于第二部分,我不知道如何实现。
在我的应用执行期间的各个时间点,都需要使用以下命令以编程方式选择UITableView的一行 [self.tableView selectRowAtIndexPath:selectedCellInde
我有一个自定义的 UITableViewCell,其中包含一些 TextView 和一个 ImageView 。这些 View 是不可选择的(在 IB 中设置)。我希望当用户点击单元格内的任意位置时触
我用它创建了一个表和一个搜索栏 Controller 。我使用了一个结构来创建表内容。我只想将所选单元格中的数据存储在变量中。我是一名新的 iOS 开发人员。请帮忙:) TIA //my struct
我在表格 View 中有 5 个自定义单元格,但 didSelectRowAtIndexPath 仅适用于一个单元格。我已在代码中该单元格的索引处添加了该行的单元格。 let cell : FileS
我现在正在弄乱 table ,我的目标是最终能够点击 table 并转到某个地方。但是,我无法使 didSelectRowAtIndexPath 工作。该表显示正常,但当我选择它时没有任何反应: cl
didSelectRowAtIndexPath:即使在将表委托(delegate)和数据源连接到文件所有者后,方法也不会调用。 当我试图打印一些东西时,它没有用这种方法打印 在下面找到我的代码供您引用
我在 viewController 中有两个 UITableView。两者都有不同的标签。带有标签 0 的 UITableview 是可编辑的,而标签 1 是不可编辑的。我的问题是当在带有标签 1 的
我正在尝试学习在我的应用程序中使用核心数据。我怎么会被困在这里 didSelectRowAtIndexPath 如果可能的话,我希望能够像以前一样使用我的 uitableview arrayA 是一个
我有一个 UITableView,其中填充了 30 多个 UITableviewCell。 我面临的问题是,当选择一行并更改单元格的 accessoryType 时,该行的第十一行也会被修改。 我已经
在我的 UITableView 中,我有 2 行。我正在尝试禁用第二行,因此我完成了图片中显示的以下操作。当我运行该程序时,虽然该行无法推送到另一个 View ,但当我单击它时蓝色突出显示仍然闪烁。
我是一名优秀的程序员,十分优秀!