Я пытаюсь перевести свое приложение на язык Swift.
У меня есть такая строка кода:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Как преобразовать его в Swift?
В документации Apple такого метода нет.
ios
swift
uiappearance
AlexZd
источник
источник
Ответы:
Обновление для iOS 9:
Если вы ориентируетесь на iOS 9+ (начиная с Xcode 7 b1), в
UIAppearance
протоколе есть новый метод , который не использует varargs:Что можно использовать так:
Если вам по-прежнему требуется поддержка iOS 8 или более ранней версии, используйте следующий исходный ответ на этот вопрос.
Для iOS 8 и 7:
Эти методы недоступны для Swift, поскольку методы varargs Obj-C несовместимы со Swift (см. Http://www.openradar.me/17302764 ).
Я написал обходной путь без вариации, который работает в Swift (я повторил тот же метод
UIBarItem
, который не происходит отUIView
):-
Обязательно
#import "UIAppearance+Swift.h"
укажите это в заголовке моста.Затем, чтобы позвонить из Swift (например):
источник
ios 10 swift 3
источник
Для iOS 8 и 7:
Я использую категорию, основанную на ответе Алекса, чтобы указать несколько контейнеров. Это обходной путь до тех пор, пока Apple официально не поддержит
appearanceWhenContainedIn
Swift.UIAppearance + Swift.h
UIAppearance + Swift.m
Затем добавьте
#import "UIAppearance+Swift.h"
в свой заголовок моста.Для использования из Swift :
Было бы хорошо, если бы я смог найти способ использовать CVarArgType , но я не нашел чистого решения.
источник
Вот менее уродливый, но все же уродливый обходной путь, вдохновленный @tdun.
AppearanceBridger
.AppearanceBridger
named+(void)setAppearance
и поместите в этот метод код появления Objective-C. Например:AppearanceBridger.setAppearance()
и все должно быть в порядке!Надеюсь, это сработает для людей, которые это видят.
источник
Вот уродливое решение, которое я использовал ...
Просто создайте сенсорный класс какао Objective-C (UIViewController) с любым именем.
Я назвал свое
WorkaroundViewController
...Сейчас в (
WorkaroundViewController.m
):Запустите код появления Objective-C для
.appearanceWhenContainedIn()
(вот мой пример):Затем создайте заголовок моста для вашего проекта Swift, а затем инициализируйте свой Objective-C ViewController в своем коде Swift, как это (опять же, только мой пример):
Тогда все готово! Дайте мне знать, если это сработает для вас ... Как я уже сказал, это некрасиво, но работает!
источник
Это может быть распространено на любой класс, соответствующий протоколу UIAppearance, а не только на UIViews. Итак, вот более общая версия:
UIAppearance + Swift.h
UIAppearance + Swift.m
источник
Я создал репо для вас, ребята, которые хотят использовать
CocoaPods
:Добавьте это в свой
Podfile
:Импортируйте в свой класс:
Ссылка: https://github.com/levantAJ/UIViewAppearanceSwift
источник
Swift 4: iOS 9+
источник
Кажется, Swift (по крайней мере, с Beta5) не может его поддерживать по неизвестным мне причинам. Возможно, необходимая языковая функция все еще находится в разработке, поскольку я могу только предположить, что они не включили ее в интерфейс по уважительной причине. Как вы сказали, согласно документации, он все еще доступен в ObjC. Действительно разочаровывает.
источник
appearanceWhenContainedIn:
все еще не на столе.Вы можете использовать это:
Изменить: внешний видWhenContainIn был удален в Swift. Этот ответ был для Beta 5, чтобы изменить внешний вид текста всех кнопок панели.
источник
UIControlState.Normal
вы можете просто использовать.Normal
Swift, который знает тип по выводу.appearanceWhenContainedIn
был удален.Вы сможете просто перевести
Objective-C
синтаксис вSwift
синтаксис.В быстром темпе методы должны быть объявлены так:
Итак, вы можете попробовать это:
Мне все еще нужно выяснить, является ли это чистым способом вызова метода класса
Swift
.Надеюсь это поможет,
источник
UIAppearance
документацию протокола (которомуUIBarButtonItem
соответствует), существует метод `appearanceWhenContainIn (_ :) (он еще не реализован в Swift): developer.apple .com / library / prerelease / ios / documentation / UIKit /…