Используя осведомленность местоположения о триггерах iPhone "X хотели бы использовать Ваше текущее местоположение" - "Не позволяют" / "хорошо". В документации CLLocationManager это указано:
"У пользователя есть опция запрета доступа приложения к данным службы определения местоположения. Во время его начального использования приложением Базовая платформа Местоположения предлагает пользователю подтверждать, что использование службы определения местоположения приемлемо. Если пользователь отклоняет просьбу, объект CLLocationManager сообщает о соответствующей ошибке своему делегату во время будущих запросов".
Я нашел, что "начальное использование" было два раза, если Вы совершаете нападки "хорошо" для разрешения служб определения местоположения. С третьего раза на iPhone будет помнить Вашу установку за все будущее использование приложения.
Однако пользователь, нажатие "Do not allow", будет постоянно беспокоиться каждый раз, когда часть приложения пробует к службам определения местоположения использования. Я попробовал по крайней мере 15 раз в моем собственном приложении и коснулся, "Не позволяют" еще больше на "Ванкувере 2010 - официальное мобильное руководство зрителя". Это является чрезвычайно раздражающим для пользователей, не желающих использовать эту функцию.
Мои вопросы:
Мне удалось установить (более раннюю версию) SDK на компьютере с ОС Windows, а затем скопировать соответствующие библиотеки в среду разработки Linux. Я хотел бы, чтобы солнце предоставило все JDK в формате zip/tar. Я ненавижу установку программного обеспечения только для того, чтобы получить файлы .jar из архива. Следует отметить, что SDK включает в себя эмулятор мобильного устройства, который не работает под Linux, но для компиляции кода нужен только .jars.
-121--4903732-Для того, чтобы любой человек, исследующий этот вопрос в будущем, вот решение, которое я в конечном итоге реализовал. Это основано на ответе Джона Боуэна, который я выбрал как лучшее решение проблемы.
Сначала я создал стиль для прозрачного списка, содержащего переключатели, как предметы. Затем я создал кнопки для перехода в поле списка - мои кнопки исправлены, а не считываются в приложение как данные, поэтому я жестко закодировал их в разметку.
Я использую перечисление ListButtons
в модели представления, чтобы представить кнопки в списке, и я использую свойство Тэгов
каждой кнопки, чтобы передать последовательности значение перечисления для этой кнопки. Свойство ListBox.SelectedStartPath
позволяет указать свойство Тэгов
в качестве источника для выбранного значения, которое связывается с моделью представления с помощью свойства SelectedValue
. Я думал, что мне понадобится конвертер значений для преобразования между последовательностью и его значением перечисления, но встроенные конвертеры WPF справились с преобразованием без проблем.
Вот полная разметка для Window1.xaml :
<Window x:Class="RadioButtonMvvmDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<!-- Resources -->
<Window.Resources>
<Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="5" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border BorderThickness="0" Background="Transparent">
<RadioButton
Focusable="False"
IsHitTestVisible="False"
IsChecked="{TemplateBinding IsSelected}">
<ContentPresenter />
</RadioButton>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border BorderThickness="0" Padding="0" BorderBrush="Transparent" Background="Transparent" Name="Bd" SnapsToDevicePixels="True">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<!-- Layout -->
<Grid>
<!-- Note that we use SelectedValue, instead of SelectedItem. This allows us
to specify the property to take the value from, using SelectedValuePath. -->
<ListBox Style="{StaticResource RadioButtonList}" SelectedValuePath="Tag" SelectedValue="{Binding Path=SelectedButton}">
<ListBoxItem Tag="ButtonA">Button A</ListBoxItem>
<ListBoxItem Tag="ButtonB">Button B</ListBoxItem>
</ListBox>
</Grid>
</Window>
Модель представления имеет единственное свойство SelectedButton, которое использует перечисление ListButtons для отображения выбранной кнопки. Свойство вызывает событие в базовом классе, который я использую для моделей просмотра, которое вызывает событие PropertyChanged
:
namespace RadioButtonMvvmDemo
{
public enum ListButtons {ButtonA, ButtonB}
public class Window1ViewModel : ViewModelBase
{
private ListButtons p_SelectedButton;
public Window1ViewModel()
{
SelectedButton = ListButtons.ButtonB;
}
/// <summary>
/// The button selected by the user.
/// </summary>
public ListButtons SelectedButton
{
get { return p_SelectedButton; }
set
{
p_SelectedButton = value;
base.RaisePropertyChangedEvent("SelectedButton");
}
}
}
}
В производственном приложении установщик SelectedButton
вызовет метод класса обслуживания, который выполнит действие, требуемое при выборе кнопки.
И чтобы быть полным, вот базовый класс:
using System.ComponentModel;
namespace RadioButtonMvvmDemo
{
public abstract class ViewModelBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region Protected Methods
/// <summary>
/// Raises the PropertyChanged event.
/// </summary>
/// <param name="propertyName">The name of the changed property.</param>
protected void RaisePropertyChangedEvent(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, e);
}
}
#endregion
}
}
Надежда, которая помогает!
-121--962293-Да, она всегда спросит вас дважды. Странный и непривлекательный имхо. Насколько я понимаю, это на случай, если ты нажмешь не ту кнопку в первый раз. После этого предполагается, что вы знаете, чего хотели.
Я обнаружил следующее в примере «DonalMe»:
«Don 't Allow» на двух последовательных запусках приложений - это то же самое, что и «never allow». Но я также читал, что другие люди видят то же поведение, что и вы. Может быть, изменение в последнем обновлении ОС? В любом случае, твой подход звучит разумно.
Я не верю, что вы можете выполнить сброс только для одного приложения, извините.