快速的文字游戏,第一部分

我想创建一个简单的应用程序,使孩子们学习词汇更有趣,同时使用iOS 11中的新拖放方法。

最后,我想与您分享。

您有两个选项卡,第一个用于提供一个可以在其中键入和编辑单词的区域,它是一个简单的表格视图。 第二个单词将您在表视图中输入的每个单词中的字母混杂在一起,以一个字母一个字母的顺序显示,邀请用户重新排列字母以使拼写正确。

当然,它并不完美; 我还没有将编辑内容放到tableview中,它并没有告诉您何时正确,但是准系统仍然存在,此外,我不想让本文过长。 漫长的技术教程我只是不喜欢我。

它是如何工作的,在这里。 首先,您需要在Xcode中基于选择选项卡的应用程序,并在创建后转到管理第一个选项卡的VC。 您可以在其中添加以下代码。

  var myTableView:UITableView = UITableView() 
 覆盖func viewWillAppear(_动画:布尔){ 
super.viewWillAppear(动画)
  //获取主屏幕边界 
 让screenSize:CGRect = UIScreen.main.bounds 
让screenWidth = screenSize.width
让screenHeight = screenSize.height
myTableView.frame = CGRect(x:0,y:0,宽度:screenWidth,高度:screenHeight)
myTableView.dataSource =自我
myTableView.delegate =自我
myTableView.register(UITableViewCell.self,forCellReuseIdentifier:“ myCell”)
self.view.addSubview(myTableView)
}
  func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int 
{
返回itemsToLoad.count
}
  func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell 
{
let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier:“ myCell”,用于:indexPath作为IndexPath)
  cell.textLabel?.text = itemsToLoad [indexPath.row] 
返回单元
}

这都是漂亮的原始代码,也许是它引用的普通swift类数据文件最重要的方面,在其中我将核心数据结构放到了一个简单的数组中。

  var itemsToLoad:[字符串] = [“狗”,“猫”,“垫子”,“星期六”] 

我发现自己对技术的选择是对还是错。 移至第二个选项卡的视图控制器,您需要通过创建按钮来切换数据集来开始。 您可以使用此代码执行此操作。

 覆盖func viewDidLoad(){ 
  super.viewDidLoad() 
如果firstRun {
firstRun =假
让按钮= UIButton()
button.setTitle(“ Next”,for:.normal)
button.setTitleColor(UIColor.blue,for:.normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self,action:#selector(pressed),for:.touchUpInside)
self.view.addSubview(按钮)
button.topAnchor.constraint(等于:self.view.topAnchor,常数:128).isActive = true
button.centerXAnchor.constraint(equalTo:self.view.centerXAnchor).isActive = true
loadScramble(word2L:firstWord)
}
}
 @objc func已按下(发送方:UIButton!){ 
whiteWin.removeFromSuperview()
如果firstWord <itemsToLoad.count — 1 {
firstWord = firstWord + 1
}其他{
firstWord = 0
}
loadScramble(word2L:firstWord)
}

firstRun布尔确保仅创建一次; 按钮本身会绕过itemsToLoad单词数组,并通过loadScramble方法逐一显示它们。

同时,loadScamble mthod的代码如下所示。 我们从堆栈视图开始,在该视图中,我们将每个单词的字母分别添加到固定大小的框中。

  func loadScramble(word2L:Int){ 
whiteWin = UIStackView()
whiteWin.axis = UILayoutConstraintAxis.horizo​​ntalwhiteWin.distribution = UIStackViewDistribution.equalSpacing
whiteWin.alignment = UIStackViewAlignment.center
whiteWin.spacing = 8.0
self.view.addSubview(whiteWin)
whiteWin.translatesAutoresizingMaskIntoConstraints = false
whiteWin.centerYAnchor.constraint(等于:self.view.centerYAnchor).isActive = true
 让演示= itemsToLoad [word2L] 
让字母=数组(演示)
 让position2S =(self.view.bounds.width-CGFloat((letters.count * 40)))/ 2 
 让margins = view.layoutMarginsGuide 
  whiteWin.leadingAnchor.constraint(equalTo:margins.leadingAnchor,常量:position2S).isActive = true 
  let shuffled =(字母为NSArray).shuffled() 
 用于洗牌{ 
让letterView = UILabel()
letterView.font = letterView.font.withSize(32)
letterView.text =“ \(字母)”
letterView.backgroundColor = UIColor.lightGray
letterView.textAlignment = .center
  //除非交互式,否则拖放操作无效 
  letterView.isUserInteractionEnabled = true 
whiteWin.addArrangedSubview(letterView)
让dragInteraction = UIDragInteraction(delegate:self)
letterView.addInteraction(dragInteraction)
让dropInteraction = UIDropInteraction(代表:自我)
letterView.addInteraction(dropInteraction)
letterView.widthAnchor.constraint(equalToConstant:32).isActive = true
letterView.heightAnchor.constraint(equalToConstant:32).isActive = true
letterView.translatesAutoresizingMaskIntoConstraints = false
}
}

我们还添加了新的拖放委托交互[不要忘记将委托添加到类方法中]。

这将我们带到新的代码部分,即拖放方法。

  var dragLocation:UIView! 
  func dragInteraction(_交互:UIDragInteraction,itemsForBeginning会话:UIDragSession)-> [UIDragItem] { 
 让letter2M = interact.view为?  UILabel 
让letter2T = letter2M?.text作为NSString?
用于self.whiteWin.arrangedSubviews {
如果(boxes.frame.contains(session.location(in:self.whiteWin))){
dragLocation =盒子
}
}
 让提供者= NSItemProvider(对象:letter2T!) 
让item = UIDragItem(itemProvider:提供程序)
归还物品]
}
  func dropInteraction(_交互:UIDropInteraction,performDrop会话:UIDropSession){ 
  session.loadObjects(ofClass:NSString.self){对象在 
让text2D =对象为! [串]
让dropLocation = session.location(in:self.whiteWin)
 用于self.whiteWin.arrangedSubviews { 
如果(boxes.frame.contains(dropLocation)){
(self.dragLocation as?UILabel)?. text =(boxes?UILabel)?. text
(框为UILabel)。.text = text2D.first
}
}
}
}
  func dropInteraction(_交互:UIDropInteraction, 
  sessionDidUpdate会话:UIDropSession)-> UIDropProposal { 
 返回UIDropProposal(操作:.move) 
  } 

拖动方法捕获源标签及其上的文本,然后传递到放置方法,放置进行交换。 那里有它。 我将在未来几天完成tableview并添加一些代码来检查答案,并将对此进行后续报道。