我dispatch_group用来调用Firebase请求函数,并在请求完成后得到通知,以便能够处理结果.在这种情况下,我刚刚发布了一个print语句.
func loadStuff() {
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group)
}
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("done")
}
}
func myFirebaseFunction(completionHandler: () -> ()) {
let usersRef = firebase.child("likes")
usersRef.observeEventType(.Value, withBlock: { snapshot in
if snapshot.exists() {
let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date",ascending: false)])
for item in sorted {
dict.append(item as! NSDictionary)
}
}
completionHandler()
})
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.问题是,在运行时,数据将添加到Firebase数据库中.这就是为什么我必须使用observeEventType而不是observeSingleEventOfType.
这意味着在运行时期间有一个观察者,如果数据已添加到数据库中,myFirebaseFunction则将再次调用其中的块.
一旦发生这种情况,应用程序崩溃,因为dispatch_group_leave(group)没有调用dispatch_group_enter(group).只要我做对了.
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group) // crash here
}
Run Code Online (Sandbox Code Playgroud)
如果我将其更改为 …
我正在使用以下代码使UITableViewCell具有动态高度:
tableView.estimatedRowHeight = 155
tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)
这段代码让UITextView根据内容改变它的高度.
extension NewUserTweetTableVC: UITextViewDelegate {
func textViewDidChange(textView: UITextView) {
let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
var newFrame = textView.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我在运行时更改了UITextView的文本,UITextView的高度就会改变,但UITableViewCell的高度却没有.我怎么能改变呢?非常感谢帮助.
我需要AccessToken让用户在我的应用程序中授予访问自己的Instagram帐户的权限.我在Instagram开发中心注册了所有内容.
目前我正在使用SimpleAuth来接收AccessTokenInstagram.
到目前为止,一切都运作良好.我收到了令牌,我可以使用它.
但是当我第一次登录时,我注意到,我不知道我的密码是什么.我总是用Facebook登录或者已经登录.我不想让我的用户遇到同样的问题并让他们重置他们的Instagram密码......
我现在用Google搜索了一段时间,没有成功.有没有办法验证用户并使用Instagram应用程序接收AccessToken?
我已经加入Instagram的到LSApplicationQueriesSchemes的info.plist和发送图像到Instagram的应用程序发布到他们那里工作.所以调用应用程序本身不是问题.
这是我当前在UIViewController中打开WebView的代码 - 但用户必须使用用户名和密码登录.
更新代码: 如何使用Instagram进行身份验证
我的可能性是什么?非常感谢帮助.
给定是一个带有x个字符的(html)字符串.String将被格式化为属性String.然后显示在UILabel.
在UILabel具有的高度>= 25和<= 50到行数限制为2.
由于String具有在格式化的属性String中不可见的字符,例如<b> / <i>,最好的方法是限制属性String的字符数.
UILabel财产.lineBreakMode = .byTruncatingTail导致词语被削减.
我们的目标,如果字符数将超过在空间的限制UILabel,是词与词之间切断.渴望maxCharacterCount = 50.确定space之前的最后一个maxCharacterCount.剪切字符串并追加...为最后一个字符UILabel.
限制角色的最佳方法是什么?帮助非常感谢.
要将用户推送到iTunes商店以获取所需的项目,我正在使用以下功能:
func openStoreProductWithiTunesItemIdentifier(identifier: String) {
let storeViewController = SKStoreProductViewController()
storeViewController.delegate = self
let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier, SKStoreProductParameterAffiliateToken : ITUNES_AFFILIATE_ID]
storeViewController.loadProductWithParameters(parameters) { [weak self] (loaded, error) -> Void in
if loaded {
self!.navigationController?.pushViewControllerWithHandler(storeViewController, animated: true) {
LilithProgressHUD.hide() // custom progress hud
}
}
}
}
extension UINavigationController {
func pushViewControllerWithHandler(viewController: UIViewController, animated: Bool, completion: Void -> Void) {
CATransaction.begin()
CATransaction.setCompletionBlock(completion)
pushViewController(viewController, animated: animated)
CATransaction.commit()
}
}
Run Code Online (Sandbox Code Playgroud)
叫做
let trackID = "thisIsMyTrackID"
openStoreProductWithiTunesItemIdentifier(trackID)
Run Code Online (Sandbox Code Playgroud)
这导致了
如果我不是:
self!.navigationController?.pushViewControllerWithHandler(storeViewController, animated: true) { …Run Code Online (Sandbox Code Playgroud) 文艺青年最爱的 我收到:
JSON text did not start with array or object and option to allow fragments not set.如果我想获得一个令牌和No refresh token available in the session!如果我尝试续订的令牌.
我正在尝试为Swift 3中的Objective-C Spotify iOS SDK beta-25设置令牌刷新.我正在使用Heroku服务器和Spotify提供的Ruby脚本,更改为我的凭据.
require 'sinatra'
require 'net/http'
require 'net/https'
require 'base64'
require 'encrypted_strings'
require 'json'
CLIENT_ID = ENV['xxx']
CLIENT_SECRET = ENV['xxx']
ENCRYPTION_SECRET = ENV['xxx']
CLIENT_CALLBACK_URL = ENV['xxx://returnafterlogin']
AUTH_HEADER = "Basic " + Base64.strict_encode64(CLIENT_ID + ":" + CLIENT_SECRET)
SPOTIFY_ACCOUNTS_ENDPOINT = URI.parse("https://accounts.spotify.com")
get '/' do
"Working"
end
post '/swap' do
# This …Run Code Online (Sandbox Code Playgroud) 我创建了一个结构,让我的字体可以全局预先缓存:
struct Fonts {
static let avenirRegular = UIFont(name: "AvenirNextCondensed-Regular", size: 14.0)
}
Run Code Online (Sandbox Code Playgroud)
用法...:
xy.font = Fonts.avenirRegular
Run Code Online (Sandbox Code Playgroud)
它告诉我,我的常数是一个可选项.
可选类型'UIFont?'的值 没有打开; 你的意思是用'!' 要么 '?'?
为什么它是可选的?是否有可能AvenirNextCondensed-Regular在每个iOS设备上都没有?非常感谢帮助.
使用Xcode 9和Swift 4以及vapor heroku push/ vapor heroku init,我收到:
-----> Swift app detected
Cloning into 'swiftenv'...
Swift 3 Heroku Installer
Version: 3.1.1
Operating System: ubuntu1404
Installing Swiftenv
Cloning into '/app/.swiftenv'...
Installing Swift
Downloading https://swift.org/builds/swift-3.1.1-release/ubuntu1604/swift-3.1.1-RELEASE/swift-3.1.1-RELEASE-ubuntu16.04.tar.gz
/tmp/swiftenv-3.1.1- /tmp/build_d
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
/tmp/build_d
3.1.1 has been installed.
? Done
-----> Installing clang-3.7.0
precompile
-----> Building Package ... this will take a while
swift-build: error: Package requires …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码创建自定义菜单转换.我花了最后两个小时试图弄清楚为什么快照显示为空白(仅使用iPhone 7 Plus模拟器).但是当我想创建一个视频使其成为这个线程的gif时,它可以在我的iPhone 6S Plus上运行.
更新:适用于iPhone 6S模拟器.但仍然没有在7 Plus.
import UIKit
class PresentMenuAnimator : NSObject {
}
extension PresentMenuAnimator : UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.6
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
let containerView = transitionContext.containerView
containerView.insertSubview((toVC?.view)!, belowSubview: (fromVC?.view)!)
// replace main view with snapshot
let snapshot = fromVC?.view.snapshotView(afterScreenUpdates: false)
snapshot?.tag = MenuHelper.snapshotNumber
snapshot?.isUserInteractionEnabled = false
snapshot?.layer.shadowOpacity = 0.7
containerView.insertSubview(snapshot!, aboveSubview: (toVC?.view)!)
fromVC?.view.isHidden …Run Code Online (Sandbox Code Playgroud) 使用Swift 3和Xcode 9我正在使用大UINavigationBar视图:
if #available(iOS 11.0, *) {
navigationBar?.prefersLargeTitles = true
UINavigationBar.appearance().largeTitleTextAttributes = [
NSForegroundColorAttributeName: Colors.black
]
}
Run Code Online (Sandbox Code Playgroud)
当我滚动a时UITableView,条形图会快速折叠,从而产生不需要的空间:
之前:
后:
我碰到UITableView酒吧的那一刻就崩溃了.
tableView具有以下属性:
let rect = CGRect(
x: 0,
y: UIApplication.shared.statusBarView?.frame.height ?? 20,
width: UIScreen.main.bounds.width,
height: UIScreen.main.bounds.height
)
let tableView = UITableView(frame: rect)
Run Code Online (Sandbox Code Playgroud)
最顶层的tableView是self.navigationController?.navigationBar.frame.height ?? 44
另外,tableView设置为:
if #available(iOS 11.0, *) {
self.contentInsetAdjustmentBehavior = .never
}
Run Code Online (Sandbox Code Playgroud)
酒吧是半透明的,我希望保持这一点.我错过了什么?非常感谢帮助.