Вопросы по тегу: swift

(131)

Swift 3.0 Данные в строку?

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {} Я хочу deviceToken в строкуно:let str = String.init(data: deviceToken, encoding: .utf8) строка равно нольсвифт 3.0 как я могу преобразовать data в string ?Регистрация для получения push-уведомлений в Xcode 8/Swift 3.0? не работает, а ответ несколько месяцев назад, я пробовал:и напечатайте:
w

weijia.wang

5 лет назад

Ответов: 12

Как мы можем использовать наборы цветов каталога активов?

Я обычно использую пользовательские UIColors на iOS с помощью расширений Swift, но теперь с iOS 11/Xcode 9 мы можем создавать наборы цветов. Как мы можем их использовать?Обновление — СоветКак говорит @Cœur, мы можем перетаскивать цвет и использовать его как объект UIColor, и возможным решением может быть использование его в качестве расширения: Или как константа:Теперь я хочу знать, можем ли мы получить к ним доступ, как доступ UIImage к Asset Image или нет, например:UIImage(named: "image-name") -> UIColor(named: "color-name")
e

elGeekalpha

5 лет назад

Ответов: 11

'#selector' относится к методу, который не доступен для Objective-C.

Новый Xcode 7.3, передающий параметр через addTarget, обычно работает для меня, но в этом случае он выдает ошибку в заголовке. Любые идеи? Он выдает другой, когда я пытаюсь изменить его на @objcСпасибо!cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside) Вызываемый селекторfunc didTapCommentButton(post: Post) { }
E

Echizzle

6 лет назад

Ответов: 4

Swift программно переходит к другому контроллеру представления/сцене

Я использую следующий код для программного перехода к другому ViewController. Он отлично работает, но каким-то образом скрывает панель навигации.Как это исправить? (панель навигации создается путем встраивания ViewController в навигационный контроллер, если это имеет значение.)let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController self.presentViewController(nextViewController, animated:true, completion:nil)
V

Victor

5 лет назад

Ответов: 8

Как передавать данные с помощью NotificationCenter в Swift 3.0 и NSNotificationCenter в Swift 2.0?

Я реализую socket.io в своем приложении Swift iOS.В данный момент на нескольких панелях слушаю сервер и жду входящие сообщения. Я делаю это, вызывая функцию getChatMessage на каждой панели:func getChatMessage(){ SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in dispatch_async(dispatch_get_main_queue(), { () -> Void in //do sth depending on which panel user is }) } } Однако я заметил, что это неправильный подход, и мне нужно изменить его - теперь я хочу начать прослушивание входящих сообщений только один раз, и когда приходит какое-либо сообщение - передавать это сообщение на любую панель, которая его прослушивает.Итак, я хочу передать входящее сообщение через NSNotificationCenter. До сих пор мне удавалось передавать информацию о том, что что-то произошло, но не передавать сами данные. Я делал это:NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil) тогда у меня была функция с именем: func showSpinningWheel(notification: NSNotification) { } и каждый раз, когда я хотел позвонить, я делал:NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self) Так как я могу передать объект messageInfo и включить его в вызываемую функцию?
u

user3766930

6 лет назад

Ответов: 6

Операторы "++" и "--" устарели Xcode 7.3

Я просматриваю заметки Xcode 7.3 и заметил эту проблему. Операторы ++ и -- устарели Может ли кто-нибудь объяснить, почему это устарело? И я прав, что в новой версии Xcode теперь вы будете использовать вместо ++ это x += 1;Пример:for var index = 0; index
O

Oleg Gordiichuk

6 лет назад

Ответов: 12

Как декодировать свойство с типом словаря JSON в декодируемом протоколе Swift [45]

Допустим, у меня есть тип данных Клиент, который содержит свойство метаданные, которое может содержать любой словарь JSON в объекте клиентаstruct Customer { let id: String let email: String let metadata: [String: Any] } { "object": "customer", "id": "4yq6txdpfadhbaqnwp3", "email": "john.doe@example.com", "metadata": { "link_id": "linked-id", "buy_count": 4 } } Свойство metadata может быть любым произвольным объектом карты JSON.Прежде чем я смогу привести свойство из десериализованного JSON из NSJSONDeserialization, но с новым протоколом Swift 4 Decodable, я до сих пор не могу придумать, как это сделать.* 100006*Кто-нибудь знает, как добиться этого в Swift 4 с декодируемым протоколом?
P

Pitiphong Phongpattranont

5 лет назад

Ответов: 14

Динамическое скрытие представления в SwiftUI

Я пытаюсь условно скрыть DatePicker в SwiftUI. Однако у меня возникли проблемы с несоответствием типов:var datePicker = DatePicker($datePickerDate) if self.showDatePicker { datePicker = datePicker.hidden() } В этом случае datePicker является типом DatePicker, но datePicker.hidden() является типом _ModifiedContent , _HiddenModifier>. Поэтому я не могу назначить datePicker.hidden() на datePicker. Я пробовал варианты этого и не могу найти способ, который работает. Есть идеи?ОБНОВЛЕНИЕВы можете развернуть тип _ModifiedContent, чтобы получить базовый тип, используя его свойство content. Однако это не решает основной проблемы. Свойство content выглядит как исходное, неизмененное средство выбора даты.
J

Jake

3 года назад

Ответов: 9

Как настроить высоту UICollectionView так, чтобы она соответствовала высоте размера содержимого UICollectionView?

Я хотел бы, чтобы UICollectionView (красный) уменьшался до высоты размера содержимого, в данном случае UICollectionViewCells (желтые), потому что есть много пустого места. Я пытался использовать:override func layoutSubviews() { super.layoutSubviews() if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) { self.invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { return self.collection.contentSize } но возврат self.collection.contentSize всегда возвращает (ширина, 0) и по этой причине он слишком сильно сжимается до значения высоты 30 (значение, которое я установил в файле XIB для высоты, хотя у меня есть константа >= 30).
c

charbinary

5 лет назад

Ответов: 16

Ошибка Xcode в симуляторе: MGIsDeviceOneOfType не поддерживается на этой платформе

У меня есть очень простое приложение с одним представлением, содержащим несколько UILabels. При запуске в симуляторе консоль Xcode возвращает ошибку: libMobileGestalt MobileGestalt.c:875: MGIsDeviceOneOfType не поддерживается на этой платформе. Сам симулятор просто показывает белый экран. Я также пытался запустить его на устройстве разработчика с тем же белым экраном. Я просмотрел документацию, но не нашел ссылки на MGIsDeviceOneOfType. Приложение написано на Swift в бета-версии Xcode 10 на macOS 10.14. Я пытаюсь запустить его на симуляторах iPhone 7-X, а также на разрабатываемом iPhone 7, на каждом из которых работает целевое программное обеспечение (12.0).
W

Woodman

4 года назад

Ответов: 18

SwiftUI — как избежать жестко запрограммированной навигации в представлении?

Я пытаюсь создать архитектуру для более крупного, готового к производству приложения SwiftUI. Я все время сталкиваюсь с одной и той же проблемой, которая указывает на серьезный недостаток дизайна в SwiftUI.По-прежнему никто не мог дать мне полный рабочий ответ, готовый к производству.Как сделать многоразовые представления в SwiftUI, которые содержат навигацию?Поскольку SwiftUI NavigationLink сильно привязан к представлению, это просто невозможно таким образом, чтобы он масштабировался и в больших приложениях.NavigationLink в этих небольших примерах приложений работает, да, но не сразу, как только вы захотите повторно использовать множество представлений в одном приложении. И, возможно, также повторное использование границ модуля. (например: повторное использование View в iOS, WatchOS и т. д.)Проблема дизайна: NavigationLinks жестко закодированы в представлении.NavigationLink(destination: MyCustomView(item: item)) Но если представление, содержащее этот NavigationLink, должно быть многоразовым, я не могу жестко запрограммировать место назначения. Должен быть механизм, который обеспечивает пункт назначения. Я спросил это здесь и получил довольно хороший ответ, но все же не полный ответ:SwiftUI MVVM Координатор/Маршрутизатор/NavigationLinkИдея заключалась в том, чтобы внедрить целевые ссылки в многоразовое представление. В целом идея работает, но, к сожалению, она не масштабируется до реальных производственных приложений. Как только у меня появляется несколько многоразовых экранов, я сталкиваюсь с логической проблемой, заключающейся в том, что для одного многократно используемого представления (ViewA) требуется предварительно сконфигурированное представление-назначение (ViewB). Но что, если ViewB также требуется предварительно сконфигурированное представление-назначение ViewC? Мне нужно было бы создать ViewB уже таким образом, чтобы ViewC уже вводился в ViewB, прежде чем я введу ViewB в ВидA. И так далее.... но поскольку данные, которые должны быть переданы в это время, недоступны, вся конструкция терпит неудачу.Еще одна идея, которая у меня была, состояла в том, чтобы использовать Environment в качестве механизма внедрения зависимостей для внедрения адресатов для NavigationLink. Но я думаю, что это следует рассматривать более или менее как хак, а не как масштабируемое решение для больших приложений. В конечном итоге мы бы использовали Environment практически для всего. Но поскольку Environment также может использоваться только внутри представлений (а не в отдельных координаторах или моделях представлений), это снова создаст странные конструкции, на мой взгляд.Как и бизнес-логика (например, код модели представления) и представление должны быть разделены, также должны быть разделены навигация и представление (например, шаблон координатора). В UIKit это возможно, потому что мы обращаемся к UIViewController и UINavigationController за представлением.UIKit's MVC уже столкнулся с проблемой, состоящей в том, что он смешал так много концепций, что получил забавное имя "Massive-View-Controller" вместо "Model-View-Controller". Теперь аналогичная проблема сохраняется в SwiftUI, но, на мой взгляд, даже хуже. Навигация и представления сильно связаны и не могут быть разделены. Поэтому невозможно создавать многоразовые представления, если они содержат навигацию. Это можно было решить в UIKit, но теперь я не вижу вменяемого решения в SwiftUI. К сожалению, Apple не предоставила нам объяснения, как решать подобные архитектурные проблемы. У нас есть только несколько небольших примеров приложений.Я бы хотел оказаться неправым. Пожалуйста, покажите мне чистый шаблон дизайна приложения, который решает эту проблему для больших приложений, готовых к производству.Заранее спасибо.Обновление: эта награда закончится через несколько минут, и, к сожалению, до сих пор никто не смог предоставить работающий пример. Но я начну новую награду для решения этой проблемы, если не найду другого решения и свяжу его здесь. Спасибо всем за их большой вклад!Обновление от 18 июня 2020 г.: Я получил ответ от Apple по этой проблеме, предлагающий что-то вроде этого для разделения представлений и моделей:enum Destination { case viewA case viewB case viewC } struct Thing: Identifiable { var title: String var destination: Destination // … other stuff omitted … } struct ContentView { var things: [Thing] var body: some View { List(things) { NavigationLink($0.title, destination: destination(for: $0)) } } @ViewBuilder func destination(for thing: Thing) -> some View { switch thing.destination { case .viewA: return ViewA(thing) case .viewB: return ViewB(thing) case .viewC: return ViewC(thing) } } } Мой ответ: Спасибо за отзыв. Но, как вы видите, у вас все еще есть сильные соединение в представлении. Теперь «ContentView» нужно знать все представления (ViewA, ViewB, ViewC) он также может перемещаться. Как я уже сказал, это работает в небольшие примеры приложений, но они не масштабируются до больших приложений, готовых к производству. Представьте, что я создаю собственное представление в проекте на GitHub. А потом импортировать это представление в мое приложение. Этот пользовательский вид ничего не знает о других представлениях, по которым он может перемещаться, потому что они специфичны в мое приложение. Надеюсь, я лучше объяснил проблему. Единственное правильное решение этой проблемы, которое я вижу, это разделить Навигация и представления как в UIKit. (например, UINavigationController) Спасибо, Дарко Так что до сих пор нет чистого и рабочего решения этой проблемы. С нетерпением жду WWDC 2020.Обновление от сентября 2021 г.: Использование AnyView не является хорошим общим решением этой проблемы. В больших приложениях в основном все представления должны быть спроектированы таким образом, чтобы их можно было использовать повторно. Это означает, что AnyView используется везде. У меня был сеанс с двумя разработчиками Apple, и они ясно объяснили мне, что AnyView создает гораздо худшую производительность, чем View, и его следует использовать только в исключительных случаях. Основной причиной этого является то, что тип AnyView не может быть разрешен во время компиляции, поэтому он должен быть выделен в куче.
D

Darko

2 года назад

Ответов: 12

Autolayout игнорируется в Custom UITableViewCell

Несмотря на установленные ограничения для всех элементов, включая вертикальные, необходимые ячейке для расчета ее высоты, авто-разметка как бы игнорируется: все ячейки сжимаются.Вот скриншот результата и ограничений в раскадровке:В VC, который содержит tableView, вот код в viewDidLoad:tableView.estimatedRowHeight = 120.0 tableView.rowHeight = UITableViewAutomaticDimension Комментирование второй строки дает ячейки с высотой 120,0, но Autolayout также игнорируется.ОбновлениеДля упрощения интерфейса я оставил одну метку с ограничениями: Впереди место для супервизора Верхнее место для суперпросмотра Фиксированная ширина и высота (100 и 100) Нижнее пространство до поля контейнера, чтобы убедиться, что ячейка имеет все вертикальные ограничения для определения ее высоты И с этим упрощенным интерфейсом авто-макет по-прежнему не учитывается, что намекает мне, что проблема возникла не из-за плохо установленных ограничений.В Инспекторе размеров высота строки установлена ​​на 120 и установлен флажок «Пользовательский». Ячейка имеет правильный пользовательский класс, идентификатор повторного использования ячейки правильный.
K

Kqtr

5 лет назад

Ответов: 2

Как использовать Facebook iOS SDK на iOS 10

Я пытаюсь использовать Xcode 8 для создания приложения с входом в Facebook с помощью Swift 3. Когда я переключаюсь обратно на iOS Simulator 9.3, он работает. В iOS 10 я получаю эту ошибку:""fbauth2:/" The operation couldn’t be completed. (OSStatus error -10814.)" иOptional(Error Domain=com.facebook.sdk.login Code=308 "(null)") У кого-нибудь есть решение?Примечание 1 :После отладки эта проблема заключается в том, что FBSDK не может обновить expect_challange. Функция SecItemUpdate внутри security.framework не работает. Это проблема IOS 10
t

trquoccuong

5 лет назад

Ответов: 6

Получить значение параметров URL

Я пытаюсь получить параметры из URL-адреса с помощью Swift. Допустим, у меня есть следующий URL:http://mysite3994.com?test1=blah&test2=blahblah Как я могу получить значения test1 и test2?
u

user2423476

5 лет назад

Ответов: 5

Удаление объекта из массива в Swift 3

В моем приложении я добавил один объект в массив при выборе ячейки и отменил выбор и удалил объект при повторном выборе ячейки. Я использовал этот код, но выдает ошибку.extension Array { func indexOfObject(object : AnyObject) -> NSInteger { return (self as NSArray).indexOfObject(object) } mutating func removeObject(object : AnyObject) { for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) { self.removeAtIndex(index) } } } class MyViewController: UITableViewController { var arrContacts: [Any] = [] var contacts: [Any] = [] func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { arrContacts.removeObject(contacts[indexPath.row]) } } У меня выдает 2 такие ошибки:C-style for statement has been removed in Swift 3 Value of type '[Any]' has no member 'removeObject'
K

Kamlesh Shingarakhiya

5 лет назад

Ответов: 13

Swift @escaping и обработчик завершения

Я пытаюсь более точно понять «замыкание» Swift.Но @экранирование и обработчик завершения слишком сложны для пониманияЯ просмотрел множество сообщений и официальных документов Swift, но мне показалось, что этого недостаточно.Это пример кода официальных документов var completionHandlers: [()->Void] = [] func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){ completionHandlers.append(completionHandler) } func someFunctionWithNoneescapingClosure(closure: ()->Void){ closure() } class SomeClass{ var x:Int = 10 func doSomething(){ someFunctionWithEscapingClosure { self.x = 100 //not excute yet } someFunctionWithNoneescapingClosure { x = 200 } } } let instance = SomeClass() instance.doSomething() print(instance.x) completionHandlers.first?() print(instance.x) Я слышал, что есть два способа и причины использовать @экранирование Первый для хранения закрытия, второй для асинхронных операционных целей.Вот мои вопросы:Во-первых, если выполняется doSomething, то someFunctionWithEscapingClosure будет выполняться с параметром закрытия, и это закрытие будет сохранено в массиве глобальных переменных.Я думаю, что закрытие равно {self.x = 100}Как self в {self.x = 100}, сохраненном в глобальной переменной completionHandlers, может подключиться к экземпляру этому объекту SomeClass*100009 * ?Во-вторых, я понимаю someFunctionWithEscapingClosure вот так.Чтобы сохранить закрытие локальной переменной completionHandler в глобальную переменную 'completionHandlers, мы используем ключевое слово@escaping`!без @escaping ключевое слово someFunctionWithEscapingClosure возвращает, локальная переменная completionHandler удалит из памяти@escaping означает сохранить замыкание в памятиЭто верно?Наконец, меня интересует существование этой грамматики.Возможно, это очень элементарный вопрос.Если мы хотим, чтобы какая-то функция выполнялась после какой-то конкретной функции. Почему бы нам просто не вызвать какую-нибудь функцию после вызова конкретной функции?В чем разница между использованием приведенного выше шаблона и использованием экранирующей функции обратного вызова?
P

PrepareFor

4 года назад

Ответов: 3

Инициализатор недоступен из-за «внутреннего» уровня защиты

У меня есть несколько протоколовСтратегия входаpublic protocol LoginStrategy { func login(_ viewController: UIViewController) func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) func getUserId() -> String } и два класса:ЛогинПровайдерpublic class LoginProvider { public let strategy: LoginStrategy public func login(_ viewController: UIViewController) { return self.strategy.login(viewController) } public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) { return self.strategy.getUserInfo(withCompletionHandler: completionHandler) } public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) { return self.strategy.createLoginButton(frame, withCompletionHandler: completionHandler) } public func getUserId() -> String { return self.strategy.getUserId() } public init(strategy: LoginStrategy) { self.strategy = strategy } } Стратегия входа в Facebookimport Foundation import FacebookCore import FacebookLogin public class FacebookLoginStrategy: LoginStrategy { public var grantedPermissions: Set? = nil public var declinedPermissions: Set? = nil public var userId: String = "" public func login(_ viewController: UIViewController) { let loginManager = LoginManager() let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email] loginManager.logIn(permissions, viewController: viewController) { loginResult in switch loginResult { case .failed(let error): print(error) case .cancelled: print("User cancelled login.") case .success(let grantedPermissions, let declinedPermissions, let accessToken): self.userId = accessToken.userId ?? "" self.grantedPermissions = grantedPermissions self.declinedPermissions = declinedPermissions print("Logged in!") } } } public func getUserId() -> String { return userId } public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) { let request = GraphRequest(graphPath: "me", parameters: ["fields":"email, name"], accessToken: AccessToken.current, httpMethod: .GET, apiVersion: FacebookCore.GraphAPIVersion.defaultVersion) request.start { (response, result) in switch result { case .success(let value): print(value.dictionaryValue) completionHandler(value.dictionaryValue) case .failed(let error): print(error) } } } public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) { let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email] let loginButton = LoginButton(readPermissions: permissions) loginButton.frame = frame completionHandler(loginButton) } } В моем ViewController:Когда я использую:let facebookLoginProvider = LoginProvider(strategy: FacebookLoginStrategy()) Там написано: «FacebookLoginStrategy» недоступен из-за «внутренней» защиты уровень
K

Khuong

5 лет назад

Ответов: 3

Как декодировать вложенную структуру JSON с помощью протокола Swift Decodable?

Вот мой JSON{ "id": 1, "user": { "user_name": "Tester", "real_info": { "full_name":"Jon Doe" } }, "reviews_count": [ { "count": 4 } ] } Вот структура, которую я хочу сохранить (неполная)struct ServerResponse: Decodable { var id: String var username: String var fullName: String var reviewCount: Int enum CodingKeys: String, CodingKey { case id, // How do i get nested values? } } Я просмотрел документацию Apple по расшифровке вложенных структур, но до сих пор не понимаю, как правильно выполнять различные уровни JSON. Будем признательны за любую помощь.
J

Just a coder

5 лет назад

Ответов: 6

Запросить разрешение для камеры и библиотеки в iOS 10 — Info.plist

Я реализовал WKWebView в приложении. на показанной веб-странице есть ввод файла, куда он должен импортировать изображение из фотографий. Всякий раз, когда я нажимаю на этот ввод и выбираю «Сделать фото» или «Фотобиблиотека», приложение внезапно падает, что, я полагаю, связано с тем, что приложению не хватает разрешения либо сделать фотографию, либо импортировать из библиотеки.Как отправить запрос на разрешение, когда пользователь выбирает один из упомянутых методов (сделать фото или библиотеку фотографий)?Я использую Swift 3.0 с WKWebView.
A

Alamri

5 лет назад

Ответов: 9

ITMS-90809: Устаревшее использование API — Apple прекратит прием приложений, использующих API UIWebView.

Вчера я загрузил свое приложение в TestFlight, и через некоторое время Apple прислала мне это предупреждение: ITMS-90809: Устаревшее использование API — Apple прекратит прием приложений, использующих API UIWebView. См. https://developer.apple.com/documentation/uikit/uiwebview для получения дополнительной информации. Дело в том, что я не использую UIWebView в своем приложении, поэтому я попытался обновить свои модули, но все равно то же самое. Кстати, это моя третья сборка на TestFlight, и Apple впервые присылает мне это. Есть идеи?ОбновлениеЭто мои капсулы:pod 'Firebase/Core' pod 'Firebase/Firestore' pod 'Firebase/MLVision' pod 'Firebase/MLVisionTextModel' pod 'SVProgressHUD' pod 'SPPermission/Camera' pod 'SPPermission/PhotoLibrary' pod 'Mantis' pod 'SwiftKeychainWrapper' pod 'SwiftyOnboard' pod 'Fabric' pod 'Crashlytics' Обновление 2 Кажется, я нашел фреймворки с проблемой.Binary file ./Pods/FirebaseMLCommon/Frameworks/FirebaseMLCommon.framework/FirebaseMLCommon matches Binary file ./Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics matches Binary file ./Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision matches Итак, теперь мне нужно ждать, пока Google исправит их и обновит мои модули?
N

Nick

2 года назад

Ответов: 23

В чем разница между удобством init и init в быстрых, явных примерах лучше

Мне трудно понять разницу между ними или назначение удобство инициализации.
C

Chino Pan

5 лет назад

Ответов: 10

Check if location services are enabled

I've been doing some research about CoreLocation. Recently, I encountered a problem that has been covered elsewhere, but in Objective C, and for iOS 8. I feel kinda silly asking this, but how can you check if location services are enabled using swift, on iOS 9? On iOS 7 (and maybe 8?) you could use locationServicesEnabled(), but that doesn't appear to be working when compiling for iOS 9. So how would I accomplish this? Thanks!
B

Brendan Chang

6 лет назад

Ответов: 10

How to solve "String interpolation produces a debug description for an optional value; did you mean to make this explicit?" in Xcode 8.3 beta?

Since beta 8.3, zillions warnings "String interpolation produces a debug description for an optional value; did you mean to make this explicit?" appeared in my code. For example, the warning popped in the following situation up, where options could lead to nil: let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)" As previously designed, it was ok for me (and the compiler) the optionals to be interpolated as 'nil'. But compiler changed its mind. What the compiler suggests is to add a String constructor with description as follows: let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)" Obviously, the results is explicit but also very very cumbersome in my opinion. Is there a better option? Do I have to fix all those warning or better wait for the next beta?
S

Stéphane de Luca

5 лет назад

Ответов: 8

Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

I have an array of keys which lead to post objects for my social network like so /posts/id/(post info) When I load the posts I load /posts/0 and then /posts/1 etc using the observeSingleEventOfType(.Value) method. I use a lazyTableView to load 30 at a time and it is quite slow. Is there any way I can use one of the query methods or another way of making it faster even if I have to restructure the data in my JSON tree. I am coming from Parse re-implementing my app and so far the experience as been quite good. Just this one thing I am a bit stuck on. Thanks in advance for the help! EDIT: func loadNext(i: Int) { // check if exhists let ideaPostsRef = Firebase(url: "https://APPURL") ideaPostsRef.childByAppendingPath(i.description).observeSingleEventOfType(.Value, withBlock: { (snapshot) in if i % 29 == 0 && i != 0 && !self.hitNull { return } // false if nil // true if not nil if !(snapshot.value is NSNull) { let postJSON = snapshot.value as! [String: AnyObject] print("GOT VALID \(postJSON)") let post = IdeaPost(message: postJSON["message"] as! String, byUser: postJSON["user"] as! String, withId: i.description) post.upvotes = postJSON["upvotes"] as! Int self.ideaPostDataSource.append(post) self.loadNext(i + 1) } else { // doesn't exhist print("GOT NULL RETURNING AT \(i)") self.doneLoading = true self.hitNull = true return } } } This recursive function essentially runs getting the value for key number i from firebase. If it is NSNULL it knows that is the last possible post to load and never does again. If NSNULL doesn't get hit but i % 29 == 0 then it returns as a base case so only 30 posts are loaded at a time (0 indexed). When I set doneLoading to true, tableView.reloadData() is called using a property observer. Here is a sample of what the array I am fetching looks like "ideaPosts" : [ { "id" : 0, "message" : "Test", "upvotes" : 1, "user" : "Anonymous" }, { "id" : 1, "message" : "Test2", "upvotes" : 1, "user" : "Anonymous" } ]
B

Big_Mac

6 лет назад

Ответов: 1

Пользовательский размер шрифта для текста в SwiftUI

У меня есть метка, которую я вижу, что я хочу использовать системный шрифт среднего размера, размером 21 пункт. Я создал пользовательское расширение для повторного использования созданного шрифта:extension Font { static var primaryButton: Font { return Font.custom("SFUIDisplay-Light", size: 21) } } Однако это не имеет никакого эффекта. Я изменил строку на HelveticaNeue-UltraLight, и это сработало, поэтому я предполагаю, что SFUIDisplay-Light — это просто неправильное имя шрифта. В книге шрифтов написано SFProText-Light, но у меня это тоже не сработало.Как правильно называется шрифт San Francisco в SwiftUI? Или: как я могу установить размер шрифта, используя системный шрифт?
L

LinusGeffarth

3 года назад

Ответов: 5

Non-'@objc' method does not satisfy optional requirement of '@objc' protocol

Overview: I have a protocol P1 which provides a default implementation of one of the Objective-C optional functions. When I provide a default implementation of the optional function there is a warning Compiler Warning: Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate' Version: Swift: 3 Xcode: 8 (public release) Attempts made: Tried adding @objc but doesn't help Question: How do I resolved this ? Is there a work around ? Code: @objc protocol P1 : UIAdaptivePresentationControllerDelegate { } extension P1 where Self : UIViewController { func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { return UIViewController() } } class A : UIViewController, P1 { }
u

user1046037

5 лет назад

Ответов: 3

How do I use custom keys with Swift 4's Decodable protocol?

Swift 4 introduced support for native JSON encoding and decoding via the Decodable protocol. How do I use custom keys for this? E.g., say I have a struct struct Address:Codable { var street:String var zip:String var city:String var state:String } I can encode this to JSON. let address = Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California") if let encoded = try? encoder.encode(address) { if let json = String(data: encoded, encoding: .utf8) { // Print JSON String print(json) // JSON string is { "state":"California", "street":"Apple Bay Street", "zip":"94608", "city":"Emeryville" } } } I can encode this back to an object. let newAddress: Address = try decoder.decode(Address.self, from: encoded) But If I had a json object that was { "state":"California", "street":"Apple Bay Street", "zip_code":"94608", "city":"Emeryville" } How would I tell the decoder on Address that zip_code maps to zip? I believe you use the new CodingKey protocol, but I can't figure out how to use this.
c

chrismanderson

5 лет назад

Ответов: 4

как сделать высоту UITextView динамической в ​​зависимости от длины текста?

Как вы можете видеть на этом изображенииthe UITextView изменяет свою высоту в соответствии с длиной текста, я хочу настроить ее высоту в соответствии с длиной текста.*Я видел другие вопросы, но решения мне не подошли
D

DeyaEldeen

5 лет назад

Ответов: 22

Как представить контроллер представления справа налево в iOS с помощью Swift

Я использую presentViewController для представления нового экрана let dashboardWorkout = DashboardWorkoutViewController() presentViewController(dashboardWorkout, animated: true, completion: nil) Это показывает новый экран снизу вверх, но я хочу, чтобы он отображался справа налево без использования UINavigationController.Я использую Xib вместо раскадровки, как мне это сделать?
U

Umair Afzal

6 лет назад

Ответов: 14

Как преобразовать данные в шестнадцатеричную строку в Swift

Мне нужно шестнадцатеричное представление значения данных в Swift.В конце концов я бы хотел использовать его так:let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")! print(data.hexString)
m

marius

5 лет назад

Ответов: 8

2022 WebDevInsider